我有一个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);
答案 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);
如果要返回文本,则必须更改两个查询中的类型 - 它们必须匹配。