MySQL ORDER BY补偿空列

时间:2014-04-14 19:30:52

标签: mysql sql-order-by

我有一个简单的MySQL选择,我想按公司名称和名字订购。表格的列是:

COMPANY_NAME

FIRST_NAME

LAST_NAME

当我使用标准ORDER BY运行select时,我得到以下内容:

SELECT COMPANY_NAME, FIRST_NAME, LAST_NAME
from TABLE_contacts
WHERE CONTACT_STATUS = 'ACTIVE'
ORDER BY COMPANY_NAME, FIRST_NAME;

+------------------+------------+-----------+
| COMPANY_NAME     | FIRST_NAME | LAST_NAME |
+------------------+------------+-----------+
|                  | Bob        | Jones     |
|                  | Mark       | Doe       |
| Acme Company     | Joan       | Todd      |
| Fun Company      |            |           |
+------------------+------------+-----------+

但是,我需要列表按字母顺序排列。有些情况下公司名称为空或名字将为空。我的目标是使用公司名称按字母顺序列出(如果存在),如果不是这样的输出,则按名字列出:

+------------------+------------+-----------+
| COMPANY_NAME     | FIRST_NAME | LAST_NAME |
+------------------+------------+-----------+
| Acme Company     | Joan       | Todd      |
|                  | Bob        | Jones     |
| Fun Company      |            |           |
|                  | Mark       | Doe       |
+------------------+------------+-----------+

我已尝试过以下声明但我的结果是一样的:

SELECT COMPANY_NAME, FIRST_NAME, LAST_NAME
from TABLE_contacts
WHERE CONTACT_STATUS='ACTIVE'
ORDER BY CASE WHEN COMPANY_NAME IS NULL THEN FIRST_NAME ELSE COMPANY_NAME END DESC;

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我想你想要:

order by coalesce(Company_Name, First_Name)

但是,这假设Company_NameNULL而不是空白。您可能需要扩展逻辑:

order by (case when Company_Name is not null and Company_Name <> ''
               then Company_Name
               else First_Name
          end)

我不确定你的例子中desc是什么。您希望的结果按升序排列。