使用ORDER BY进行SQL多列排序

时间:2011-10-27 13:29:52

标签: mysql sql

我试过这个:

SELECT first_name,last_name,company_name FROM users ORDER BY last_name, company_name ASC



我有一个users表,如下所示:

+------------------+--------------------+--------------------+
| first_name       | last_name          | company_name       |
+------------------+--------------------+--------------------+
| Alfa             | Alfa               | Bravo              |
+------------------+--------------------+--------------------+
| Echo             | Echo               | Alfa               |
+------------------+--------------------+--------------------+
| Delta            | Delta              |                    |
+------------------+--------------------+--------------------+
|                  |                    | Charlie            |
+------------------+--------------------+--------------------+

此刻行的顺序是:

 , ,Charlie
Alfa, Alfa, Bravo
Delta, Delta,
Echo, Echo, Alfa


我想要实现的是主要通过last_name来排序行,但如果它不可用(空),请按company_name排序,但是仍然会将此company_name-column与last_name-columns进行比较...抱歉可能不准确说明。这是我想要达到的顺序:

Alfa, Alfa, Bravo
 , ,Charlie
Delta, Delta,
Echo, Echo, Alfa

编辑:这可以通过单个MySQL查询吗?

5 个答案:

答案 0 :(得分:6)

您应该使用COALESCE

SELECT first_name,last_name,company_name 
FROM users ORDER BY coalesce(last_name, company_name) ASC

COALESCE是ANSI SQL兼容的,BTW。

答案 1 :(得分:1)

使用ISNULL()功能。如果last_name值为NULL,那么它将使用company_name值进行排序。

ORDER BY ISNULL(last_name, company_name)

如果你的last_name不是NULL,只是一个空字符串,你可以使用NULLIF()函数解决这个问题:

ORDER BY ISNULL(NULLIF(last_name,''), company_name)

答案 2 :(得分:1)

SELECT * FROM your_table
ORDER BY COALESCE(last_name, company_name)

答案 3 :(得分:1)

如果使用Oracle,则将空VARCHAR列视为NULL。然后按照上面的建议使用COALESCENVL

否则,如果列中有空字符串(非NULL),则可以使用ORDER BY CASE last_name WHEN '' THEN ...等。

答案 4 :(得分:0)

您可以在查询中添加一个额外的列:

SELECT first_name,last_name,company_name,
case when last_name is null 
then company_name
else last_name
end as ord 
FROM users ORDER BY ord  ASC