MySQL由一个数字命令,Nulls持续

Jon*_*onB 258 mysql sql-order-by

目前我在声明中做了一个非常基本的OrderBy.

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC
Run Code Online (Sandbox Code Playgroud)

这个问题是'position'的NULL条目被视为0.因此,位置为NULL的所有条目都出现在1,2,3,4之前.例如:

NULL, NULL, NULL, 1, 2, 3, 4
Run Code Online (Sandbox Code Playgroud)

有没有办法实现以下排序:

1, 2, 3, 4, NULL, NULL, NULL.
Run Code Online (Sandbox Code Playgroud)

小智 538

MySQL有一个未记录的语法,可以最后对空值进行排序.在列名前面加一个减号( - )并将ASC切换到DESC:

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC
Run Code Online (Sandbox Code Playgroud)

它基本上是position DESC将NULL值置于最后但与之相同的相反position ASC.

这里有一个很好的参考http://troels.arvin.dk/db/rdbms#select-order_by

  • 它没有记录,` - col_name`是一个表达式(`0 - col_name`),ORDER BY子句接受它.当然这仅适用于数字列. (75认同)
  • 正如评论所示,它适用于数字,日期和时间列?但是,varchar怎么样?它也适用于varchar吗?我尝试将它应用于varchar字段,但顺序似乎与使用ASC或DESC不同. (10认同)
  • 好一个.适用于'date`和`time`列!(MySQL 5.5).我想(我懒得检查)它适用于所有类似数字的列(时间戳,浮点数......). (7认同)
  • 这是否会阻止按列使用可能的索引? (7认同)
  • @koral:它是一个简单(有用)的数学表达式,可以反转顺序,除非语言本身发生巨大变化,否则不会删除它. (6认同)

d-_*_*_-b 289

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

SELECT * FROM table ORDER BY ISNULL(field), field ASC;
Run Code Online (Sandbox Code Playgroud)

  • 没有按工作重新定义顺序:```SELECT*FROM table ORDER BY ISNULL(field)ASC;`````(MySQL 5.5) (6认同)
  • 这是一个更好的解决方案. (5认同)
  • 在postgresql 9.3中,接受的解决方案不适用于TIMESTAMP.这个解决方案...... (4认同)
  • @kalu:在**PostgreSQL**中,NULL值按升序排序*last*(首先按降序排序).而你宁愿使用[*标准SQL*子句`NULLS LAST` | `NULLS FIRST`](http://stackoverflow.com/a/9511492/939860)翻转它而不是这里的解决方法. (3认同)
  • 这应该是公认的答案。-sort_column 技巧甚至不适用于所有类型的列。这个答案确实很好用!谢谢 (3认同)
  • 令人讨厌的是,当你将isnull(field)添加到order by子句时(当使用limit时),MySQL不会在字段上使用索引. (2认同)

Dre*_*ewM 23

就像是

SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC
Run Code Online (Sandbox Code Playgroud)

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

  • 该解决方案很脆弱,可能会导致间歇性错误 (3认同)

sum*_*eet 17

NULL最后

SELECT * FROM table_name ORDER BY id IS NULL, id ASC
Run Code Online (Sandbox Code Playgroud)

  • 为什么投票?这个答案完全有效:http://sqlfiddle.com/#!9/e14492/11 (6认同)
  • 很好的工作解决方案,你能解释一下吗? (3认同)

jcd*_*dsr 6

这对我来说也很有效。

ORDER BY ISNULL(field), field = 0 ASC;
Run Code Online (Sandbox Code Playgroud)

返回 1 2 3 0 0 空 空