2011-08-01 41 views
3

我在數據庫中有一個'name'列,其值爲'john,smith'。我將一個字符串變量'name_respository'傳遞給一個存儲過程,其值爲'test,test1,john,test2'或'temp,smith,temp1,temp2'。字符串變量'name_repository'的值是在運行時生成的,它們可能是temp或test。如何比較列中的逗號分隔值與Oracle中的字符串集合

現在,這就是我想要做的,我試圖選擇名稱在name_repository中的行。問題是我有'john,smith'作爲名稱,而name_repository只有其中的一個。我需要分離名稱變量john和smith,然後與收集和返回行進行比較。

+----------+----------+ 
| ID  | Name  | 
+----------+----------+ 
| 1  | john,smith | 
| 2  | james,stone | 
| 3  | john,smith | 

現在變量我通過可能有史密斯或者約翰還是詹姆斯或石頭等垃圾值。 如果我有史密斯或約翰作爲我的參數,我應該返回第1行和第3行。

查詢應該是這樣的

Select * from table where name in name_repository 

回答

1

使用INSTR(),以查找參數
使用SUBSTR()逗號來接從參數的左側和右側的文本。例如:

Substr('john,smith',1,instr('john,smith',',')-1) to give you 'john' 
Substr('john,smith',instr('john,smith',',') to give you 'smith' 

然後就是把這些返回到您的WHERE子句

Where 'john' in(name_repository) OR 'smith in(name_repository) 

或者只寫自己的分裂功能... :-)

+0

我還沒有嘗試過其他答案,但這是最快和整潔 – gizgok

2

你可能分裂名字是這樣的:

SELECT REGEXP_SUBSTR (name, '[^,]+', 1, LEVEL) data 
FROM table 
CONNECT BY LEVEL <= LENGTH(name) - LENGTH(REPLACE(txt, ',')) + 1 
0

請看下面的鏈接: link

這似乎是一個緊湊的解決方案可能是以下幾點:

SQL> SELECT str 
    2 ,  REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL) AS single_element 
    3 ,  LEVEL         AS element_no 
    4 FROM (
    5   SELECT ROWNUM AS id 
    6   ,  str 
    7   FROM t 
    8  ) 
    9 CONNECT BY INSTR(str, ',', 1, LEVEL-1) > 0 
10   AND id = PRIOR id 
11   AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL; 

STR       SINGLE_ELEMENT     ELEMENT_NO 
------------------------------ ------------------------------ ---------- 
X,Y,Z       X          1 
X,Y,Z       Y          2 
X,Y,Z       Z          3 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG XXX          1 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG Y          2 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG ZZ          3 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG AAAAA         4 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG B          5 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG CCC          6 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG D          7 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG E          8 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG F          9 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG GGG         10 

13 rows selected. 
Note that the in-line view is required to alias ROWNUM (as it cannot be used directly in the PRIOR clause on line 10). 
0

簡單的一個可能是:

select * from table 
where regexp_replace(name,'^.*,','') in name_repository 
or regexp_replace(name,',.*'') in name_repository; 

第一個正則表達式從字符串,第二個第二跳越頭名名稱。

相關問題