2009-08-20 14 views
5

MySQL sunucu sürümü 5.0.45. Aşağıdaki düşünün: Ben beklediğiniz gibiMySQL CASE bildiriminde boş kümeyi kullanma

(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 

daha büyük bir ifadenin Bu alt sorgu çalışır, çoğu zaman bir 'evet' veya 'hayır' dize değeri elde edilmiştir. İdeal değil, ama başkasının kodu üzerinde çalıştığınız şey bu! Bununla birlikte, bazen seçim, boş bir kümeyi yasal olarak iade edebilir; bu durumda, foo, NULL olarak ayarlanır. Bu aslında uygulamayı kırmaz, ama rahatsız edici. Tabloda eşleşen satır olmasa bile, foo'nun her zaman "evet" veya "hayır" olacağını garanti etmenin bir yolu var mı? Boş seti "hayır" davayı temsil etmek istiyorsanız

cevap

5

bir skaler alt sorgu, varsa (yani bir SELECT veya WHERE yan tümcesinde kullanmak değil, FROM yan tümcesi), o zaman bu kullanın:

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

hatta bu:

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

Çok teşekkür çok! –

0

, muhtemelen yerine yapabilirsiniz:

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

Bu büyük ölçüde alt sorgu değiştirmek zorunda kalmadan hem casees yönetecek.