MySQL Orderby一个数字,最后为空

目前我正在我的声明中做一个非常基本的orderderby。

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.
157362 次浏览

你可以用不同的值交换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

类似的

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

将999999999替换为该字段的最大值

你可以在ORDER BY语句中合并你的null值:

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

如果你想让null在底部排序,尝试coalesce(position, 100000)。(使第二个数字大于db中所有其他position。)

我发现这在很大程度上是一个很好的解决方案:

SELECT * FROM table ORDER BY ISNULL(field), field ASC;

MySQL有一个未记录的语法来最后对空进行排序。在列名前加一个负号(-),并将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

你为什么不按NULLS LAST排序呢?

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

试着使用这个查询:

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

对于DATE列,您可以使用:


取消:

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

空格:

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

空最后

SELECT * FROM table_name ORDER BY id IS NULL, id ASC
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC

达到以下结果:

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

使用语法,在字段名之前放置-(minus sign)并使用逆order_type(例如:如果你想按ASC顺序排序,那么使用DESC,如果你想按DESC顺序排序,那么使用ASC)

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

这工作得很好:

SELECT * FROM tablename ORDER BY position = 0, position ASC;

position
1
2
3
0
0

这对我来说也很有效。

ORDER BY ISNULL(field), field = 0 ASC;
< p >返回 1 2 3. 0 0 零 空< / p >

这是简单的。你只需要订购两次:

  • 第一步,订购null
  • 第二步,整理你的领域。
SELECT * FROM table_name
ORDER BY ISNULL(field_name), field_name;

它适用于任何类型,包括JSON。