SQL:2003拡張機能T611NULLS LAST
で指定されているように、最後のすべてのNULL列()で結果を並べ替えたいと思います。悲しいことに、SQLiteはそれをサポートしていないようです。賢い回避策はありますか?
8 に答える
これはうまくいくでしょうか?
SELECT ....... ORDER BY COALESCE(col1,col2,col3,etc) IS NULL
「すべてのNULL列が最後にある」というあなたの言い回しにちょっと混乱しています。すべてのNULL値を特定の列の最後に配置する場合は、次を使用します。
SELECT ....... ORDER BY col1 IS NULL
私は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
。
SQLite3.30.0+はサポートNULLS FIRST/LAST
句です。
- ORDERBY句にNULLSFIRSTおよびNULLSLAST構文のサポートを追加します。
SQLiteは、ソートの目的でNULL値を他のどの値よりも小さいと見なします。したがって、NULLは、ASCオーダーバイの開始時とDESCオーダーバイの終了時に自然に表示されます。これは、「ASCNULLSLAST」または「DESCNULLSFIRST」構文を使用して変更できます。
SELECT * FROM t ORDER BY c NULLS LAST;
あなたはそれを偽造するためにこのようなことをすることができます:
select * from test
order by case ordercol when null then 1 else 0 end, ordercol
私は同じ問題に遭遇しました。私はこれがうまくいくことを知りました:
isnull
( SQLiteの関数は見つかりませんでした)
order by ifnull(column_what_you_want_to_sort,'value in case of null')
私の解決策は、priority
列の範囲を逆にして使用することでしたorder by desc
(降順で並べ替えます)。これにより、最後にnullが発生します。
明らかに、これは注文列を制御する場合にのみ機能しpriority
ますが、スイングできると非常に便利です。
それでもうまくいかない場合は、ユニオンクエリが機能していることがわかりました。単純に2つのクエリを実行し、最初と2番目union
に制約を追加します。2番目のクエリは最初のクエリの最後になります。where not null
where null
私の場合、最初にNULL列で降順で並べ替えたいと思いました。クエリ後にwhileループからリストにレコードを追加しているので、列がNULLであるかどうかを確認し、ArrayList.add(0, Object)
これを実現するために使用しました。
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;