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',即使表中没有匹配的行?
答案 0 :(得分:6)
如果它是一个标量子查询,(即你在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')
答案 1 :(得分:0)
如果你想让空集代表一个“不”的情况,你可能会这样做:
select ... where ... (foo = 'no' or foo is null)
这样可以处理这两种情况而无需彻底更改子查询。