处理MySQL CASE语句中的空集

时间:2009-08-20 14:35:06

标签: mysql null case

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总是'yes'或'no',即使表中没有匹配的行?

2 个答案:

答案 0 :(得分:6)

如果它是一个标量子查询,(即你在SELECTWHERE子句中使用,而不是在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')

答案 1 :(得分:0)

如果你想让空集代表一个“不”的情况,你可能会这样做:

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

这样可以处理这两种情况而无需彻底更改子查询。