0

可能重复:
如何在 oracle sql 的 WHERE IN 子句中传递变量?

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

4

2 回答 2

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

于 2012-11-04T08:27:14.840 回答
0

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

目前,您可以使用EXISTSand 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
于 2012-11-04T08:30:30.707 回答