📜  在 ORDER BY 子句中使用 CASE 按 SQL 中 2 列的最小值对记录进行排序(1)

📅  最后修改于: 2023-12-03 14:51:03.474000             🧑  作者: Mango

在 ORDER BY 子句中使用 CASE 按 SQL 中 2 列的最小值对记录进行排序

在 SQL 中,可以使用 ORDER BY 子句对查询结果进行排序。通常情况下,我们可以指定要按照哪些列进行排序,以及排序的方式(升序或降序)。但是,如果要按照不同的列进行排序,这时我们就需要使用 CASE 语句来完成排序了。

问题描述

假设有一个包含以下数据的表:

| id | name | value1 | value2 | |----|-------|--------|--------| | 1 | Alice | 10 | 20 | | 2 | Bob | 30 | NULL | | 3 | John | NULL | 40 |

现在,我们要按照 value1 和 value2 的最小值对记录进行排序,如果其中一个值为 NULL,则取另一个值做比较。也就是说,我们希望得到以下结果:

| id | name | value1 | value2 | |----|-------|--------|--------| | 1 | Alice | 10 | 20 | | 3 | John | NULL | 40 | | 2 | Bob | 30 | NULL |

在这个例子中,第一行记录的最小值是 10,第二行记录的最小值是 40,第三行记录的最小值是 30(因为 value2 为 NULL,所以使用 value1 进行比较)。

解决方案

要完成这个排序,我们可以使用以下 SQL 查询语句:

SELECT id, name, value1, value2
FROM mytable
ORDER BY (CASE
  WHEN value1 <= COALESCE(value2, value1) THEN value1
  ELSE COALESCE(value2, value1)
END) ASC

这个查询语句中,我们使用了一个 CASE 语句来计算每条记录的最小值。如果 value1 小于等于 value2(或者 value2 为 NULL),则使用 value1 进行比较,否则使用 value2 进行比较。

注意,为了处理 NULL 值,我们使用了 COALESCE 函数。这个函数接受多个参数,返回第一个非 NULL 值。在这个例子中,如果 value2 为 NULL,则 COALESCE(value2, value1) 返回 value1。

最后,我们在 ORDER BY 子句中使用这个 CASE 语句的结果进行排序。由于我们要按照最小值进行排序,所以使用 ASC(升序)方式进行排序。

总结

在 SQL 中,可以使用 CASE 语句来动态计算排序的依据。通过结合 COALESCE 函数,我们可以处理 NULL 值,从而得到正确的排序结果。