2011-04-18 67 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) ...