WHERE查询场景

时间:2013-04-30 13:41:30

标签: sql db2

我在DB中有一个包含各种列的表,其中一列是Name。假设DB中的Name是A,B,C,D,E,F。

我写了一个查询:

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

(假设#ENTERED_NAMES#是USER在GUI上输入的各种名称)

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

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

所以查询应该是

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

4 个答案:

答案 0 :(得分:2)

试试这个 首先将字符串串联为'A','B','C'

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

答案 1 :(得分: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  

答案 2 :(得分: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

但是,我仍然不确定我们是否有一个非常合适的问题,以便最适合你想要做的事情。

答案 3 :(得分:0)

您可以做的最好的事情是为除数据库中存在的值之外的所有输入值编写“CASE”。