2009-08-20 5 views
5

Сервер MySQL версии 5.0.45. Рассмотрим следующий пример:Обработка пустого набора в операторе MySQL CASE

(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 

Этого подзапрос большего заявление работает, как я ожидал, не давая «да» или «нет» строкового значения большой части времени. Это не идеально, но это то, что вы получаете за работу над чужим кодом!

Однако иногда выбор может законно возвращать пустой набор, и в этом случае foo имеет значение NULL. Это фактически не нарушает приложение, но это раздражает. Есть ли способ гарантировать, что foo всегда будет «да» или «нет», даже если в таблице нет соответствующих строк?

ответ

5

Если это скалярный подзапрос (т.е. использовать в предложении SELECT или WHERE, а не в ЕКОМ), а затем использовать это:

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

Спасибо очень много! –

0

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

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

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