oracle查询使用IN运算符选择值

时间:2014-10-17 03:17:52

标签: sql oracle

我有一个包含有效位置列表的字符串。

var locations = COLOMBO,DELHI,SINGAPORE

我想查询属于上述字符串中提及位置的所有员工

我使用以下查询

SELECT emp_id,emp_name 
FROM EMPLOYEE 
WHERE emp_location IN (locations) ;

Oracle正在考虑将其作为单个字符串并搜索以下查询字符串

SELECT emp_id,emp_name 
FROM EMPLOYEE 
WHERE emp_location IN ('COLOMBO,DELHI,SINGAPORE');

我想知道是否有任何方式可以传递字符串并获得属于字符串中提到的位置的有效emp_idemp_name

2 个答案:

答案 0 :(得分:3)

如上所述here

首先,您需要使用REGEXP_SUBSTR函数将字符串拆分为单个字符串

VAR locations = 'COLOMBO,DELHI,SINGAPORE';

SELECT REGEXP_SUBSTR(locations,'[^,]+', 1, level) 
FROM dual
CONNECT BY REGEXP_SUBSTR(locations, '[^,]+', 1, level) IS NOT NULL;

然后将其用作select中的子查询以获得所需的结果

VAR locations = 'COLOMBO,DELHI,SINGAPORE';

SELECT emp_id,emp_name FROM EMPLOYEE 
WHERE emp_location in(
SELECT REGEXP_SUBSTR(locations,'[^,]+', 1, level) FROM dual
CONNECT BY REGEXP_SUBSTR(locations, '[^,]+', 1, level) IS NOT NULL);

答案 1 :(得分:1)

您正在寻找字符串中提到的位置,因此实际上是作为字符串子字符串的位置。 Oracle为此类搜索提供INSTR。

只知道要查找从逗号到逗号的完整城市(在前端和尾部添加逗号)。因此,不要在'伦敦,纽约'找到'YORK'(因为',纽约,'不是',伦敦,纽约','没有逗号'的'YORK'将成为'伦敦,纽约的子串“)。

select emp_id,emp_name 
from EMPLOYEE 
where instr(','|| locations || ',' , ',' || emp_location || ',') > 0;