2009-08-20 5 views
5

MySQL-Server-Version 5.0.45. Beachten Sie Folgendes:Umgang mit leeren Satz in MySQL CASE-Anweisung

(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 

Diese Unterabfrage einer größeren Anweisung funktioniert, wie ich erwarten würde, was zu einem ‚Ja‘ oder ‚Nein‘ String-Wert der meisten Zeit. Es ist nicht ideal, aber das ist es, was man bekommt, wenn man an jemand anderem Code arbeitet!

Manchmal kann die Auswahl jedoch eine leere Menge ausgeben, in diesem Fall wird foo auf NULL gesetzt. Dies bricht die Anwendung nicht wirklich, aber es ist irritierend. Gibt es eine Möglichkeit, dass ich garantieren kann, dass foo immer entweder 'ja' oder 'nein' ist, auch wenn es keine passenden Zeilen in der Tabelle gibt?

Antwort

5

Wenn es sich um eine skalare Unterabfrage ist, (dh Sie verwenden in einer SELECT oder WHERE Klausel nicht in FROM-Klausel), dann verwenden:

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

oder auch diese:

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

Dank sehr viel! –

0

Wenn Sie die leere Menge ein „Nein“ Fall darstellen möchten, können Sie dies wahrscheinlich stattdessen tun:

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

Diese beiden casees behandeln würde, ohne drastisch zu müssen Ihre Unterabfrage ändern.

Verwandte Themen