2012-11-04 198 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