0

我在 DB 中有一个包含各种列的表,其中之一是Name. 假设NameDB 中的 s 是 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 是有效名称,但 DB 中不存在 Y、Z,所以我想要 A、B、C 的结果,但对于 Y、Z(无效值),我想要名称为“D”的结果" 对于所有无效值。

所以查询应该是

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

4 回答 4

2

尝试首先将字符串连接为'A','B','C'

Select * from Table where Name IN ('A','B','C');
于 2013-04-30T13:43:30.600 回答
0

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

于 2013-05-01T05:21:32.557 回答
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_INFO
-----+----------
一个 | 有效的    
乙| 有效的    
C | 有效的    
D | 无效的  
D | 无效的  
于 2013-04-30T14:27:37.167 回答
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

但是,我仍然不确定我们是否有正确的问题来确定最适合您尝试做的任何事情。

于 2013-05-01T00:37:18.873 回答