如何在mysql查询中替换“空集”?

时间:2015-03-11 21:22:14

标签: mysql sql

我有一个mysql查询:

SELECT zip AS z FROM zip WHERE zip = 90210;

当找到匹配的行90210时,它返回:

+-------+
| z     |
+-------+
| 90210 |
+-------+

找不到行时,会返回一个空集。

Empty set (0.01 sec)

我想弄清楚的是,在空集的情况下,我可以得到这样的响应(注意' false'不重要,它可以是整数,字符串,或者我需要定义的任何东西):

+-------+
| z     |
+-------+
|'false'|
+-------+

我尝试使用SELECT EXISTS但值为0/1而不是值/' false'。

SELECT EXISTS(SELECT zip AS z FROM zip WHERE zip = 90210);

3 个答案:

答案 0 :(得分:2)

为了保证查询返回一行,您可以使用聚合。这是一种方法:

SELECT COALESCE(MAX(zip), 'false') AS z
FROM zip
WHERE zip = '90210';

这假设zip是一个字符串,因此类型是兼容的。如果没有,您可能希望将其转换为字符串,因为显然需要返回字符串。

至于你的方法,你需要使用case语句,而这又需要另一个子查询来获取zip。因此,我更喜欢上述方法。

答案 1 :(得分:1)

此查询将执行您想要的操作。从Dual中选择意味着从无表中选择。我们的想法是选择所有邮政编码,并将其与“假”字符串联合起来(如果没有该邮政编码的条目,您可以将其替换为您想要的任何内容)。

SELECT zip AS z FROM zip WHERE zip = 90210
    UNION ALL
SELECT "false" FROM dual WHERE NOT EXISTS(SELECT zip AS z FROM zip WHERE zip = 90210);
编辑:感谢Paul Griffin,这是一个小小的小提琴:http://sqlfiddle.com/#!9/9b169/8

答案 2 :(得分:0)

我通常会做一个UNION,比如

create table #zip (zip int);
insert into #zip values (90210);

SELECT zip AS z FROM #zip WHERE zip = 90210
UNION
SELECT 0 WHERE NOT EXISTS (SELECT 1 FROM #zip WHERE zip = 90210);

如果要返回文本,则必须更改两个查询中的类型 - 它们必须匹配。