SQL查询的IN子句中以逗号分隔的字符串

时间:2012-11-04 08:18:52

标签: sql sql-server-2008

  

可能重复:
  how to pass a variable in WHERE IN clause of oracle sql?

我的表Prefix中有一列Tbl_Prefix,其值为字符串,以逗号分隔,如下所示:

'aaa','bbb','ccc'

我有一张员工表Tbl_Employee,如下所示:

Empno Prefix
------------
1000  aaa
2000  eee
3000  ccc
4000  aaa
5000  ddd

我需要在此查询的IN子句的WHERE部分中使用此前缀:

Select * 
from Tbl_Employee  
where Tbl_Employee.Prefix  in (select  Tbl_Prefix.prefix 
                               from Tbl_Prefix 
                               where Tbl_Prefix.flag = 'y') 

内部选择查询select Tbl_Prefix.prefix from Tbl_Prefix where Tbl_Prefix.flag='y'的结果为'aaa','bbb','ccc'

如何在'IN'子句中使用此字符串,以便获得正确的结果?

2 个答案:

答案 0 :(得分:1)

首先,不要这样做。创建数据桶/链接表并将aaa,bbb和ccc链接到其相关关系。

但是,如果你必须这样做(尽可能改变它!),你将不得不创建一个动态SQL字符串并执行它。因此,从select到where构建字符串并附加“Prefix”分隔字符串,然后调用EXEC

所以,你将设置:

@sql = 'SELECT YOURSTUFF FROM YOURTABLE WHERE YOURCOLUMN IN ' + @prefix. @prefix应该是您需要的tbl_Prefix的列值(aaa,bbb,ccc)。

构建完字符串后,EXEC @sql

答案 1 :(得分:0)

如果这些值存储在您的数据库中,那么您应该认真重新考虑数据库设计。创建一个子表,其中包含每个父记录的每个逗号分隔值的记录。

目前,您可以使用EXISTSLIKE离开,但如果您有大量记录,此查询会很快变慢。

select 
  * 
from 
  Tbl_Employee e
where 
  exists  
    (select * from 
       Tbl_Prefix x
    where
       x.flag = 'y' and
       x.prefix like '%''' + e.prefix + '''%') 
       -- Add quotes to prevent false matches