2010-01-12 88 views
7

只是要求非常相似这一个问题...MySQL的排序依据一个数字,空字符串(或0)最后

目前,我在我的发言做一个非常基本的排序依据。

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

这样做的问题是,对于“位置”空字符串条目为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

我假定溶液可具有某种替换功能的,但我没有能找到一个函数,它通过谷歌来做我所追求的。

非常感谢,

JonB

回答

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

我认为这会起作用,但它不是最好的解决方案。我认为'position'应该是一个整数列,如果是这种情况,'CASE'表达式也应该使用整数,而不是字符串。如果“位置”不是一个整数或至少是数字,那么按数字排序不会起作用。此外,此解决方案还添加了一个新列以进行排序,这可能会对性能产生负面影响。如果我假设'position'实际上是一个整数是正确的,那么OP可能意味着'NULL'值在他写'空字符串'的地方,这意味着你可以简单地写'ORDER BY COALESCE(position,〜0),id DESC' – 2010-01-12 21:14:17

+0

@Roland:OP很清楚地表明这个位置是一个字符串:*“与此相关的问题是'位置'的空字符串条目被视为0。”* – RedFilter 2010-03-10 13:38:31

+0

OrbMan是的,他做到了。我说这可能是问题的一部分。我的建议是先给它一个适当的数据类型,而不是之后尝试扫描。 – 2010-03-10 16:10:37

0

你可以尝试加入两个子查询,其中一个选择ID> 0,而不是空的,而其他选择空,0只

1

你可以尝试一个CASE statement,像这样:

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

我意识到这是一个古老的答案,但它只是救了我的屁股。谢啦! – mingos 2010-12-07 14:06:33

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>来检查你的表格定义。如果职位不是一个整数类型,我建议你改变它。主要原因是字符串,即使它们看起来像数字,也不排序为数字。

相关问题