42

SQL:2003拡張機能T611NULLS LASTで指定されているように、最後のすべてのNULL列()で結果を並べ替えたいと思います。悲しいことに、SQLiteはそれをサポートしていないようです。賢い回避策はありますか?

4

8 に答える 8

34

これはうまくいくでしょうか?

SELECT ....... ORDER BY COALESCE(col1,col2,col3,etc) IS NULL

「すべてのNULL列が最後にある」というあなたの言い回しにちょっと混乱しています。すべてのNULL値を特定の列の最後に配置する場合は、次を使用します。

SELECT ....... ORDER BY col1 IS NULL
于 2012-09-19T21:26:49.770 に答える
24

私はBlorgbeardの答えがいくらか好きですが、このバリアントは正しいデータ型の有効な「偽の」値を提供することを気にしません。

ORDER BY CASE WHEN SOMECOL IS NULL THEN 1 ELSE 0 END, SOMECOL

あるいは、偽の値を使用したい場合でも、私は好むでしょうIFNULL

ORDER BY IFNULL(SOMECOL,-9999)

Michaelが指摘したように、SQLiteはを使用しIFNULLます。ANSI-SQLユニバーサルバージョンも使用できますCOALESCE

于 2012-09-19T21:37:16.023 に答える
17

SQLite3.30.0+はサポートNULLS FIRST/LAST句です。

リリース履歴(v3.30.0-2019-10-04)

  1. ORDERBY句にNULLSFIRSTおよびNULLSLAST構文のサポートを追加します。

注文者

SQLiteは、ソートの目的でNULL値を他のどの値よりも小さいと見なします。したがって、NULLは、ASCオーダーバイの開始時とDESCオーダーバイの終了時に自然に表示されます。これは、「ASCNULLSLAST」または「DESCNULLSFIRST」構文を使用して変更できます。

SELECT * FROM t ORDER BY c NULLS LAST;

db-fiddle.comデモ

于 2019-10-05T08:49:18.897 に答える
5

あなたはそれを偽造するためにこのようなことをすることができます:

select * from test
order by case ordercol when null then 1 else 0 end, ordercol 
于 2012-09-19T21:29:29.050 に答える
4

私は同じ問題に遭遇しました。私はこれがうまくいくことを知りました:

isnull( SQLiteの関数は見つかりませんでした)

order by ifnull(column_what_you_want_to_sort,'value in case of null')
于 2016-04-01T13:13:06.030 に答える
0

私の解決策は、priority列の範囲を逆にして使用することでしたorder by desc(降順で並べ替えます)。これにより、最後にnullが発生します。

明らかに、これは注文列を制御する場合にのみ機能しpriorityますが、スイングできると非常に便利です。

それでもうまくいかない場合は、ユニオンクエリが機能していることがわかりました。単純に2つのクエリを実行し、最初と2番目unionに制約を追加します。2番目のクエリは最初のクエリの最後になります。where not nullwhere null

于 2019-02-02T18:33:13.277 に答える
0

私の場合、最初にNULL列で降順で並べ替えたいと思いました。クエリ後にwhileループからリストにレコードを追加しているので、列がNULLであるかどうかを確認し、ArrayList.add(0, Object)これを実現するために使用しました。

于 2019-09-02T12:11:36.897 に答える
0

3.30.0より前のSQLiteバージョンでASCNULLSLAST機能(特にTEXT列)を探している場合に備えて、この回答を追加します(したがって使用できません)。

nullを最後に配置するには、nullを値に置き換えてから、他のすべての値がそれよりも小さいことを確認します。

SELECT * FROM customers ORDER BY
CASE
    WHEN Company IS NULL THEN '2'
    ELSE '1' || Company
END
ASC;

また、INTEGER列の場合、(テキストで辞書式順序を切り替えるのではなく)数値の比較を維持する必要がある場合は、NULLをテキストに変更するだけです。SQL比較でTEXT>INTEGER

SELECT * FROM customers ORDER BY
CASE
    WHEN IntegerColumn IS NULL THEN 'null'
    ELSE IntegerColumn
END
ASC;
于 2020-11-19T13:04:32.780 に答える