2009-08-20 82 views
5

MySQL服務器版本5.0.45。考慮以下幾點:在MySQL CASE語句中處理空集

(SELECT CASE 
    WHEN t.group_id = 12 THEN 'yes' 
    ELSE 'no' 
    END 
    FROM sample_table t 
    WHERE t.user_id = 2 
    AND t.group_id = 12) as foo 

較大語句的這種子查詢工作方式,我期望,產生一個「是」或「否」的字符串的大部分時間價值。這並不理想,但這就是你在處理別人的代碼時所得到的結果!

但是,有時select可以合法地返回一個空集,在這種情況下,foo被設置爲NULL。這實際上並沒有破壞應用程序,但它令人不快。有沒有一種方法可以保證foo始終是'是'還是'否',即使表中沒有匹配的行?

回答

5

如果它是一個標量子查詢(即您在SELECTWHERE子句中使用,而不是在FROM子句),然後使用此:

IF(
EXISTS 
(
SELECT NULL 
FROM sample_table t 
WHERE t.user_id = 2 
     AND t.group_id = 12 
), 'yes', 'no' 
) 

,甚至這樣的:

COALESCE(
(
SELECT 'yes' 
FROM sample_table t 
WHERE t.user_id = 2 
     AND t.group_id = 12 
), 'no') 
+0

感謝非常許多! – 2009-08-21 03:09:45

0

如果你想空集來表示「無」的情況下,你也許可以做到這一點,而不是:

select ... where ... (foo = 'no' or foo is null) 

這將同時處理casees,而無需徹底改變你的子查詢。