MySQL Order By一个数字,Empty Strings(或0's)Last

时间:2010-01-12 20:44:39

标签: mysql sql-order-by

刚问了一个与这个问题很相似的问题......

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

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

这个问题是'position'的空字符串条目被视为0.因此,位置为空字符串的所有条目都显示在1,2,3,4之前。例如:

'', '', '', 1, 2, 3, 4

或:

0, 0, 0, 1, 2, 3, 4

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

1, 2, 3, 4, '', '', ''.

或:

1, 2, 3, 4, 0, 0, 0.

我认为解决方案可能具有某种替换功能,但我无法找到能够完成我所追求的功能。

4 个答案:

答案 0 :(得分:15)

SELECT * 
FROM tablename 
WHERE visible=1 
ORDER BY 
    case when position in('', '0') then 1 else 0 end,
    position ASC, 
    id DESC

答案 1 :(得分:1)

您可以尝试CASE statement,如下所示:

SELECT *
FROM tablename
WHERE visible = 1
ORDER BY CASE position WHEN '' THEN '9999' ELSE position END CASE ASC,
    ID DESC

答案 2 :(得分:1)

你说position包含空字符串条目......你的意思是空字符串,还是指NULL?如果它实际上包含NULL个条目,你应该稍微修改一下Orbman的声明:

SELECT * 
FROM tablename 
WHERE visible=1 
ORDER BY 
    COALESCE(position, ~0)
,   id DESC

COALESCE()返回第一个参数NOT NULL的值。 〜0是一段黑魔法,可以获得MySQL支持的最大整数值。 (〜做一个按位否定,将所有0位变为1)。因此,在这种情况下,如果position IS NULL为真,则返回18446744073709551615,否则返回position的值。

我还想指出,position列的数据类型最有可能是某种整数类型(请参阅http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html)。因为你提到空字符串,我认为你应该通过SHOW CREATE TABLE <tablename>检查你的表定义。如果position不是整数类型,我建议你改变它。主要原因是字符串,即使它们看起来像数字,也不会被排序为数字。

答案 3 :(得分:0)

您可以尝试加入两个子查询,其中一个选择ID&gt; 0并且不为空,另一个选择为空,仅为0