如何将列中的逗号分隔值与Oracle中的字符串集合进行比较

时间:2011-08-01 16:22:18

标签: sql oracle stored-procedures oracle10g

我在数据库中有一个列'name',其值为'john,smith'。我将一个字符串变量'name_respository'传递给存储过程,该过程的值为'test,test1,john,test2'或'temp,smith,temp1,temp2'。字符串变量'name_repository'值是在运行时生成的,它们可能是temp或test。

现在我正在尝试这样做,我正在尝试选择name在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

4 个答案:

答案 0 :(得分:2)

你可以像这样拆分名字:

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

答案 1 :(得分:1)

使用Instr()在参数
中查找逗号 使用Substr()从参数的左侧和右侧选择文本。 E.g:

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)

或者......只需编写自己的分割函数......: - )

答案 2 :(得分: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).

答案 3 :(得分:0)

一个简单的可能是:

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

第一个正则表达式从字符串中删除第一个名称,第二个名称是第二个名称。