2009-08-20 15 views
5

Serwer MySQL wersja 5.0.45. Rozważmy następujący:Obsługa pustego zestawu w instrukcji CASE MySQL

(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 

To podzapytanie większego rachunku działa jak będę oczekiwać, otrzymując „tak” lub „nie” wartość ciągu większość czasu. To nie jest idealne, ale to właśnie dostajesz za pracę nad czyimś kodem!

Jednak czasami opcja select może legalnie zwrócić pusty zestaw, w którym to przypadku foo ma wartość NULL. To faktycznie nie łamie aplikacji, ale jest irytujące. Czy jest sposób, w jaki mogę zagwarantować, że foo zawsze będzie "tak" lub "nie", nawet jeśli nie ma pasujących wierszy w tabeli?

Odpowiedz

5

Jeśli jest to skalarna podzapytanie (tj użyć w SELECT lub WHERE klauzuli, nie w klauzuli FROM), a następnie użyć tego:

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

lub nawet poniżej:

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

Dzięki bardzo dużo! –

0

Jeśli chcesz zbiór pusty do reprezentowania „nie” przypadek, prawdopodobnie można to zrobić w zamian:

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

To będzie obsługiwać zarówno casees bez konieczności drastycznie zmienić podzapytania.

Powiązane problemy