Umgang mit leerem Satz in der MySQL-CASE-Anweisung
Frage
MySQL-Serverversion 5.0.45.Folgendes berücksichtigen:
( 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 erwartet und liefert in den meisten Fällen einen Zeichenfolgenwert „Ja“ oder „Nein“.Es ist nicht ideal, aber das ist es, was man bekommt, wenn man am Code eines anderen arbeitet!
Manchmal kann die Auswahl jedoch legitimerweise eine leere Menge zurückgeben. In diesem Fall wird foo auf NULL gesetzt.Dadurch wird die Anwendung nicht wirklich unterbrochen, es ist jedoch irritierend.Gibt es eine Möglichkeit, sicherzustellen, dass foo immer entweder „yes“ oder „no“ lautet, auch wenn die Tabelle keine passenden Zeilen enthält?
Lösung
Wenn es sich um eine skalare Unterabfrage handelt (d.e.Sie verwenden in a SELECT
oder WHERE
Klausel, nicht in der FROM-Klausel), dann verwenden Sie Folgendes:
IF(
EXISTS
(
SELECT NULL
FROM sample_table t
WHERE t.user_id = 2
AND t.group_id = 12
), 'yes', 'no'
)
oder auch das:
COALESCE(
(
SELECT 'yes'
FROM sample_table t
WHERE t.user_id = 2
AND t.group_id = 12
), 'no')
Andere Tipps
Wenn Sie möchten, dass die leere Menge einen „Nein“-Fall darstellt, können Sie stattdessen wahrscheinlich Folgendes tun:
select ... where ... (foo = 'no' or foo is null)
Dies würde beide Fälle behandeln, ohne dass Sie Ihre Unterabfrage drastisch ändern müssten.