MYSQL - 按字母顺序排序2列,如果第一列为空,则使用第二列

时间:2012-01-25 18:19:01

标签: mysql sorting

我正在尝试按字母顺序对我的mysql数据库进行排序,其中company_name是主要排序,但如果没有company_name,则按last_name排序。我将在下面列出一个例子。

company_name :(主要排序列)
1 ABC卡车运输
2天才加热
3
4 Xtreme Windows

last_name :(二级列)
1布莱恩特 2罗杰斯
3火石
4刘易斯

这样的分类:
1 ABC卡车运输
3火石
2天才加热
4 Xtreme Windows

这是否可能,或者我应该将它们合并到数组中并使用php对它们进行排序?

2 个答案:

答案 0 :(得分:6)

使用案例和顺序选择列作为'名称'。以示例最佳显示。

SELECT
CASE WHEN company_name IS NULL THEN last_name ELSE company_name END AS name
FROM mytable
ORDER BY name ASC

如果你真的想,你也可以在order by子句中使用case语句 我认为上面的问题确实是一个更好的解决方案,因为你甚至不再拥有php中的逻辑,但你可能不同意。

SELECT company_name, last_name
FROM mytable
ORDER BY CASE WHEN company_name IS NULL THEN last_name ELSE company_name END ASC

编辑:我只假设company_name IS NULL对你来说是正确的。如果你需要在不同的条件下这样做,那就是你自己的运动。它是空的吗?或者应该将其与''进行比较?

答案 1 :(得分:1)

借用user606723的答案,但展示了如何在MySQL中更常用,即使用IFNULL()

IFNULL()返回第一个表达式,除非第一个表达式为null,否则它将返回第二个表达式。它专为这些类型的场景而设计。

SELECT
  IFNULL(company_name, last_name) AS name
FROM mytable
ORDER BY name

修改

如果company_name持有空格而不是NULL,那么你可以这样做:

SELECT
  IF(company_name <> '', company_name, last_name) AS name
FROM mytable
ORDER BY name

使用IF语句,如果第一个表达式的计算结果为true,则返回第二个表达式,否则返回第三个表达式。

如果您可能有NULL或空白,那么这将起作用:

SELECT
  IF(company_name IS NOT NULL AND company_name <> '', company_name, last_name) AS name
FROM mytable
ORDER BY name