2011-04-18 60 views
32

如果它存在,我想选择a2.date,但是如果它是NULL我想选择a1.datea2正在左连接)。这个:如果另一列为空,则选择一列

SELECT a2.date OR a1.date 
     ... 

只是返回一个布尔结果(正如人们所期望的那样),但是如何获得非空列的实际值呢? (a2.date是优选的,但如果它是空的,则a1.date

+0

[Conditional NOT NULL case SQL]可能的重复(http://stackoverflow.com/questions/4821031/conditional-not-null-case-sql) – nawfal 2013-05-03 13:20:19

回答

82

的ANSI方法是使用COALESCE

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

MySQL的本地语法是IFNULL

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

与COALESCE,IFNULL是无法移植到其他数据库。

另一个ANSI语法,该CASE expression,是一个选项:

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

它需要更多的方向才能正常工作,但如果需求的变化更灵活。

+0

'COALESCE'是等价的'CASE'语句的语法糖所以在这里提到它有点多余。为了使用类比,所有的SQL约束都可以使用'SELECT COUNT(*)'(基数)查询来表示,但是如果我在发布的每个使用“FOREIGN KEY”的回答中指出了这一点,它可能会对所有相关人员变得谨慎。但是对此的一个倒退会有点苛刻。 – onedaywhen 2011-04-19 10:10:00

+1

@OMGPonies:不要担心downvoters--或者更准确地说,“仇敌会讨厌。” – 2017-08-03 19:10:51

4

使用CASE statement作为选择。

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

查看COALESCE函数。

获取可变数量的参数并返回第一个非空值。它可以与连接一起使用。

3
SELECT COALESCE(a2.date, a1.date) ... 
相关问题