web-dev-qa-db-ja.com

MySQLの番号順、ヌルは最後

現在、私はステートメントで非常に基本的なOrderByを行っています。

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC

これに関する問題は、 'position'のNULLエントリが0として扱われることです。したがって、NULLの位置を持つすべてのエントリは、1,2,3,4のエントリよりも前に表示されます。例えば:

NULL, NULL, NULL, 1, 2, 3, 4

次の順序を実現する方法はありますか?

1, 2, 3, 4, NULL, NULL, NULL.
244
JonB

MySQLには、nullを最後にソートするための文書化されていない構文があります。列名の前にマイナス記号(-)を置き、ASCをDESCに切り替えます。

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC

これは基本的にposition DESCの逆で、NULL値を最後に配置しますが、それ以外はposition ASCと同じです。

良いリファレンスはこちら http://troels.arvin.dk/db/rdbms#select-order_by

517
user1052645

私はこれがほとんどの部分に適したソリューションであることがわかりました。

SELECT * FROM table ORDER BY ISNULL(field), field ASC;
282
d-_-b

何かのようなもの

SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC

999999999をフィールドの最大値に置き換えます

24
DrewM

NULL LAST

SELECT * FROM table_name ORDER BY id IS NULL, id ASC
13
sumeet

このクエリを使用してみてください。

SELECT * FROM tablename
WHERE visible=1 
ORDER BY 
CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC
4
Rachit Patel

NULLのインスタンスを別の値に交換して、最初(0や-1など)または最後(大きい数字や文字)に並べ替えることができます...

SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2
  FROM tablename
 WHERE visible = 1
 ORDER BY ordered_field2 ASC, id DESC
3
Langdon

ORDER BYステートメントで coalesce NULLを指定できます。

select * from tablename
where <conditions>
order by
    coalesce(position, 0) ASC, 
    id DESC

NULLを下部でソートする場合は、coalesce(position, 100000)を試してください。 (2番目の数値を、データベース内の他のpositionのすべてより大きくします。)

3
Seth
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC
3
YasirPoongadan

DATE列には、次を使用できます。


最後のNULL:

ORDER BY IFNULL(`myDate`, '9999-12-31') ASC

最後に空白:

ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC
2
Danny Beckett