MySQL订单数字,Null持续

时间:2010-01-12 19:09:40

标签: mysql sql-order-by

目前我在声明中正在做一个非常基本的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.

13 个答案:

答案 0 :(得分:513)

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

答案 1 :(得分:281)

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

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

答案 2 :(得分:24)

这样的东西
SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC

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

答案 3 :(得分:11)

NULL LAST

{{1}}

答案 4 :(得分:4)

尝试使用此查询:

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

答案 5 :(得分:3)

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

答案 6 :(得分:3)

您可以在ORDER BY声明中coalesce您的NULL:

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

如果要在底部对NULL进行排序,请尝试coalesce(position, 100000)。 (使第二个数字大于数据库中的所有其他position。)

答案 7 :(得分:3)

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

答案 8 :(得分:2)

对于DATE列,您可以使用:

NULLS最后:

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

空白最后:

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

答案 9 :(得分:1)

要获得以下结果:

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

答案 10 :(得分:1)

这很好:

let checkMarkPosition = UserDefaults.standard.integer(forKey: "showOnCustomButton")

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

答案 11 :(得分:0)

这很简单。您只需要订购两次:

  • 第一步,对 NULL 进行排序
  • 第二步,为您的字段排序。
SELECT * FROM table_name 
ORDER BY ISNULL(field_name), field_name;

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

答案 12 :(得分:-8)

为什么不通过NULLS LAST订购?

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