2014-09-27 82 views
0

如何設置 「IN」 statment,這樣的默認值:用「IN」語句設置默認值?

SELECT username 
FROM user 
WHERE id IN (1,2,3,4) 
ORDER BY FIELD(id,1,2,3,4) 

如果id = 2不可用,則返回0null,像這樣:

John33 
0 
amanda1 
erik 
+1

作爲用戶名FROM(選擇)(用戶名爲NULL,則爲0時結束)FROM – Mihai 2014-09-27 17:31:13

+1

@Mihai - 或使用['IFNULL'](http://dev.mysql.com/doc/refman/5.0/en/control-flow -F unctions.html#function_ifnull);) – slugonamission 2014-09-27 17:32:26

+1

或coalesce .... – Mihai 2014-09-27 17:32:42

回答

2

你需要做到這一點a left join

SELECT u.username 
FROM (select 1 as id union all select 2 union all select 3 union all select 4 
    ) ids left join 
    user u 
    on u.id = ids.id 
ORDER BY FIELD(id, 1, 2, 3, 4); 

邏輯在where子句不能將新行添加到結果集中。

2

一個IN (list)比較返回一個布爾值,(TRUE,FALSE或NULL)爲其評估的每一行。

因此,foo IN (list)不能(自己)「產生」在行源中不可用的行。

(你說id = 2「不可用」,我們認爲這意味着沒有排在滿足這個謂詞user。)

您能產生結果集如圖所示,但是它沒有根本不需要比較IN

您需要一個確保返回所需「id」值的行源;內聯視圖是一種方便的方法。

SELECT u.username 
    FROM (SELECT 1 AS id 
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 
     UNION ALL SELECT 4 
     ) n 
    LEFT 
    JOIN user u 
    ON u.id = n.id 
ORDER BY n.id 

LEFT JOIN指定外部聯接操作。也就是說,如果右側表格(user)中的匹配行與左側表格(n)中的行匹配,則查詢將返回n的行以及所有的NULL值從user列。

您可以使用SELECT列表中的表達式替換該用戶名的NULL值。檢查u.id是否爲NULL(這意味着沒有找到匹配的行),並返回其他內容。例如,文字0

SELECT IF(u.id IS NULL,'0',u.username) AS username 

如果您要更換的username所有NULL值這是MySQL的特定語法的ANSI標準相當於

SELECT CASE WHEN u.id IS NULL THEN '0' ELSE u.username END AS username 

,生產的不只是NULL值當user行缺少:

SELECT IFNULL(u.username,'0') AS username