2012-11-04 206 views
0

可能重复:
how to pass a variable in WHERE IN clause of oracle sql?逗号分隔的字符串

我有一列Prefix在我的表Tbl_Prefix与值由逗号这样的分隔字符串:

'aaa','bbb','ccc' 

我有一张员工表Tbl_Employee li柯本:

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

我需要在这个查询中使用这个前缀在我WHERE条款的IN部分:

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'子句中使用这个字符串,以便我得到正确的结果?

+1

数据库??????? – nawfal

+0

数据库是SQL服务器2008 – Soumya

+5

顺便说一句,如果这些值存储在你的数据库中,那么你应该认真重新考虑你的数据库设计。创建一个包含每个父记录的每个逗号分隔值记录的子表。如果数据像这样转储,则创建一个作业来将原始数据处理为类似的结构。有了适当的表格结构,你只需要一个相对简单的内部连接。 – GolezTrol

回答

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

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