2013-04-30 63 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」,而不是數據庫中存在的值。