2013-04-30 51 views
0

我在DB中有一个表,有不同的列,其中之一是Name。假设DB中的Name s是A,B,C,D,E,F。WHERE查询场景

我写了一个查询:

Select * from Table where Name IN (#ENTERED_NAMES#) 

(假设#ENTERED_NAMES#按用户在GUI中输入的各种名称)

现在假设用户在GUI中输入以下名称:A,B, C,Y,Z

由于A,B,C是有效名称,但Y,Z不存在于DB中,所以我想A,B,C的结果照原样,但对于Y,Z无效的值)我想要所有无效值的名称“D”的结果。

所以查询应是

Select * from Table where Name IN (A,B,C,D) 
+0

你使用了什么样的SQL? – Paul 2013-04-30 13:50:59

+1

'名称'是否是唯一的? – Ryan 2013-04-30 13:54:10

+0

是唯一的,我正在使用DB2 – user2235603 2013-04-30 13:57:32

回答

2

试试这个 第一CONCAT字符串为 'A', 'B', 'C'

Select * from Table where Name IN ('A','B','C'); 
+0

你应该有反向逗号分隔字符串,因为名称是字符串形式 – Jenika 2013-04-30 13:45:44

+1

你没有得到我的问题 – user2235603 2013-04-30 13:46:40

+0

雅我没有写在我的问题中引号,忽略了 – user2235603 2013-04-30 13:47:13

0

像这样的事情可能?

-- create a table containing all valid names 
create table valid_names (name varchar(20)); 
insert into valid_names values ('A'); 
insert into valid_names values ('B'); 
insert into valid_names values ('C'); 
commit; 

with usernames (name) as (
    values ('A'),('B'),('C'),('X'),('Y') -- this is the user input 
) 
select case 
     when vn.name is null then 'D' 
     else un.name 
     end as name, 
     case 
     when vn.name is null then 'invalid' 
     else 'valid' 
     end as name_info -- name info is just for the demo! 
from usernames un 
left join valid_names vn on vn.name = un.name; 

返回如下:

 
NAME | NAME_INFO 
-----+---------- 
A | valid  
B | valid  
C | valid  
D | invalid 
D | invalid 
0

我不知道这是你应该真正想要的,但它似乎是你问什么:

如果你有一个临时的表格,你插入你的GUI输入值,然后

SELECT coalesce(t.name,'D') 
    FROM gui_input g 
    LEFT JOIN db_table t on g.name = t.name 

你会好一点这个:

SELECT g.name, coalesce(t.name,'*invalid*') 
    FROM gui_input g 
    LEFT JOIN db_table t on g.name = t.name 

SELECT g.name, case when t.name is null then '*OK*' else '*invalid*' end 
    FROM gui_input g 
    LEFT JOIN db_table t on g.name = t.name 

但尽管如此,我不知道我们有很正确的问题会怎样无论你正在尝试做的最适合。

0

你能做的最好的事情是为所有输入值写一个“CASE”,而不是数据库中存在的值。