Обработка пустого набора в операторе MySQL CASE - PullRequest
5 голосов
/ 20 августа 2009

MySQL версия сервера 5.0.45. Учтите следующее:

( 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 всегда будет «да» или «нет», даже если в таблице нет совпадающих строк?

Ответы [ 2 ]

6 голосов
/ 20 августа 2009

Если это скалярный подзапрос (т. Е. Вы используете в предложении SELECT или WHERE, а не в предложении 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 голосов
/ 20 августа 2009

Если вы хотите, чтобы пустой набор представлял случай «нет», вы, вероятно, могли бы сделать это вместо этого:

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

Это будет работать с обоими кейсами без необходимости кардинально менять свой подзапрос.

...