Mysql在不为空时按列排序,然后按其他列排序


Mysql order by column when not empty then order by other column

我想得到一些帮助,这些帮助已经困扰了我两天了。我需要从数据库中检索数据,并在数据不为空时按column1排序,然后按column2 排序结果的其余部分

column1      column2
1            11
2            12
3            13
             14
             15
             16

要求结果

1,2,3,14,15,16

我尝试过很多方法,最近一次失败的尝试是

$SQL = "SELECT * FROM table ORDER BY COALESCE(column1, column2) DESC";

$SQL = "SELECT * FROM table ORDER BY COALESCE(column1, column2) ASC";

我上面的SQL在第2列上方的第1列返回NULL值

这应该有效:

$SQL = "SELECT * FROM table ORDER BY COALESCE(NULLIF(Other,''), column2) DESC";

我在这里看到了它:带有空字符串的SQL Coalesce

只有当列1中的"空"值实际上是NULL时,

coalesce()才会工作。空字符串不会触发coalesce()操作。

除此之外,您的查询将不起作用。你不能用两列来做一个select *,然后神奇地在结果中得到一列。为此,您需要一个UNION查询:

(SELECT column1 AS col FROM yourtable)
UNION ALL
(SELECT column2 AS col FROM yourtable)
ORDER BY col

如果想要1列,可以尝试NULLIFCOALESCE的组合,这应该同时考虑空值和null值

SELECT COALESCE(NULLIF(column1, ''), column2) AS COL
FROM table

SQLFiddle演示

如果你真的想把所有的数字都放在一个结果行上,用逗号分隔,你可以使用GROUP_CONCAT和前面的代码:

SELECT GROUP_CONCAT(COALESCE(NULLIF(column1, ''), column2)) AS col
FROM table

SQLFiddle Demo2

老问题,但这个解决方案对我有效:

$SQL = "SELECT * FROM table ORDER BY COALESCE(NULLIF(column1, ''), column2)";

您应该能够像这样使用CASE

SELECT *
FROM table
ORDER BY 
CASE WHEN LENGTH(column1) IS >0 THEN column1 
ELSE column2 END 
ASC

http://dev.mysql.com/doc/refman/5.0/en/case.html