MYSQL - 如果第一列为空,则按字母顺序对第二列进行排序

5
我正在尝试按字母顺序排序我的MySQL数据库,其中公司名称是主要排序列,但如果没有公司名称,则按姓氏排序。以下是一个示例:
公司名称:(主要排序列) 1 ABC Trucking 2 Genius Heating 3 4 Xtreme Windows
姓氏:(次要排序列) 1 Bryant 2 Rogers 3 Flint 4 Lewis
排序如下: 1 ABC Trucking 3 Flint 2 Genius Heating 4 Xtreme Windows
这是否可能完成,或者我应该将它们合并到一个数组中,并使用PHP进行排序?
2个回答

6

只需使用case将一列选择为“name”,并按其排序即可。最好通过示例展示。

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 对你的情况正确。如果你需要在不同条件下执行此操作,那么这将是你自己的联系。它是空的吗?还是应该将其与 '' 进行比较?


我可以向后退并将字段设置为空,如果它是空的,或者我可以将其评估为''。现在该字段不为空,而是为空。 - Lawrence Gadette
1
条件就像你要在where子句中使用一样。select * from tablename where company_name = '',如果这让你得到了所有公司名为空的行,那么你需要把company_name = ''作为条件。 - user606723

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 语句,如果第一个表达式为真,则返回第二个表达式,否则返回第三个表达式。

如果可能存在 NULL 或空白,则可以使用以下代码:

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

你的例子和606723的例子都差不多可以工作。我感觉自己缺少一些小东西。输出结果看起来像这样。排序如下: 1 ABC货运 2 Genius供暖 4 Xtreme窗户缺少只有姓氏的行。 - Lawrence Gadette
啊,那不是NULL,而是空白。你可以使用IF语句来处理。我正在更新答案。 - Marcus Adams
1
像这样的IF语句(或者它真的是一个函数)真的有优势吗?我觉得情况语句更加通用。我坦率地认为这是不好的做法,但也许我对某些事情还不了解。 - user606723
完美。不过我有一个相关的问题。我需要在while语句中使用我的记录ID。现在唯一可用的数组标识符是$row[name]。我也需要$row[ID]。你有什么想法吗? - Lawrence Gadette
@user606723,如果您所说的“普遍正确”是指SQL92标准,那么我同意,CASE更为通用。我猜它们会执行相同的操作。 - Marcus Adams
@ Lawrence,在SELECT语句中添加你需要的任何其他列。 - Marcus Adams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接