如果另一个列为空,选择一列

57

如果存在a2.date,则我想选择它,但如果它为NULL,则我想选择a1.datea2是左连接)。 这样写:

SELECT a2.date OR a1.date
       ...

该方法返回布尔值(如预期所示),但我该怎么获取非空列的实际值呢?(首选a2.date,但如果为null,则为a1.date


4个回答

145

ANSI的做法是使用COALESCE函数:

SELECT COALESCE(a2.date, a1.date) AS `date`
   ...

MySQL的本机语法是IFNULL

SELECT IFNULL(a2.date, a1.date) AS `date`
   ...

与COALESCE不同,IFNULL无法移植到其他数据库。
另一个ANSI语法选项是CASE表达式
SELECT CASE
         WHEN a2.date IS NULL THEN a1.date
         ELSE a2.date
       END AS `date`
   ...

它需要更多的指导才能正常工作,但如果需求发生变化,它会更加灵活。


COALESCE是等效的CASE语句的语法糖,因此在这里提到它有点多余。用类比的方式来说,所有的SQL约束都可以使用SELECT COUNT(*)(基数)查询来表示,但如果我在每个使用FOREIGN KEY的答案中指出这一点,可能会让所有人感到疲倦。但是对此进行投票否决可能有点过分。 - onedaywhen
2
@OMGPonies:不要担心那些踩你的人 - 或者用更流行的说法,“讨厌者总是讨厌”。 - Arvindh Mani

6

使用 CASE 语句 进行选择。

SELECT CASE WHEN a2.date IS NULL THEN a1.date
    ELSE a2.date END AS mydate

5

请查看COALESCE函数。

它接受可变数量的参数并返回第一个非空值。它与连接一起使用效果很好。


4
SELECT COALESCE(a2.date, a1.date) ...

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