我试过这个:
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查询吗?
答案 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。然后按照上面的建议使用COALESCE
或NVL
。
否则,如果列中有空字符串(非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