2011-07-18 21 views
1

我想创建一个MyQSL查询类似追加到MySQL的结果,如果在不为1列的结果

SELECT person, city FROM mytable 
UNION 
SELECT 'BOB', 'Chicago' IF 'BOB' NOT IN (SELECT person FROM mytable); 

如果“BOB”在结果未返回,我想给他追加到结果并列举他在芝加哥。如果BOB确实回来了,不管他的位置是什么,我都不想把他追加到芝加哥。

如果我完全匹配列,我可以做这项工作,但如果他被列为除芝加哥以外的其他地方,我最终会得到多个BOB结果。

SELECT person, city FROM mytable 
UNION 
SELECT 'BOB', 'Chicago' 

但我不想匹配的位置。只是这个人的名字。

回答

1

这应该工作:

SELECT person, city FROM mytable 
UNION 
SELECT 'BOB', 'Chicago' from dual 
where NOT exists (SELECT person FROM mytable WHERE person = 'BOB'); 

更优化的版本,返回相同的结果

SELECT person, city FROM mytable WHERE person <> 'BOB' 
UNION 
SELECT 'BOB', COALESCE((select city from mytable WHERE person = 'BOB'), 'Chicago') from dual 
+0

谢谢那有效......但什么是“双重”? – Chris

+1

'dual'对于那些喜欢总是指定表名的人来说,当没有具体的表来从中获取数据时,'dual'是一种方便。在mySql和MSSQL中它不是必需的,因为它在Oracle中。但是,如果您需要指定WHERE,它仍然是必需的。例如:'select 1'与'select 1 from dual'相同,但'select'ok'where 0 = 0'不起作用,您需要'dual'在这里,'select'ok'from dual',其中0 = 0 ' –

0

这是你的原始查询的重写,应该工作:

SELECT person, city FROM mytable 
UNION 
SELECT 'BOB', 'Chicago' from dual where not exists (
    SELECT NULL FROM mytable where person = 'BOB' 
);