可能重复:
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'子句中使用此字符串,以便获得正确的结果?
答案 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)
如果这些值存储在您的数据库中,那么您应该认真重新考虑数据库设计。创建一个子表,其中包含每个父记录的每个逗号分隔值的记录。
目前,您可以使用EXISTS
和LIKE
离开,但如果您有大量记录,此查询会很快变慢。
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