从Oracle SQL中的replace()函数的输出中使用带有逗号分隔字符串的“IN”子句
我有一个逗号分隔的字符串,我想在语句的in子句中使用它。 例:100101102 由于In和In子句中必须引用单个字符串,因此我使用替换函数: 例如:从dual中选择| |替换'100101102'、'、'、'、'、'| | 但是,当我尝试使用上面的输出作为IN子句的输入时,上面的查询是有效的,它不返回任何数据。我只受SQL语句的限制,所以不能使用PL/SQL代码。请帮忙从Oracle SQL中的replace()函数的输出中使用带有逗号分隔字符串的“IN”子句,oracle,Oracle,我有一个逗号分隔的字符串,我想在语句的in子句中使用它。 例:100101102 由于In和In子句中必须引用单个字符串,因此我使用替换函数: 例如:从dual中选择| |替换'100101102'、'、'、'、'、'| | 但是,当我尝试使用上面的输出作为IN子句的输入时,上面的查询是有效的,它不返回任何数据。我只受SQL语句的限制,所以不能使用PL/SQL代码。请帮忙 select * from employee where employee_number in ( select '
select * from employee where employee_number in (
select ''''||replace('100,101,102',',',''', ''')||'''' from dual);
上述方法不起作用。请让我知道我遗漏了什么。本例中的一般方法是将逗号分隔列表解析为Oracle集合,并在SQL语句中使用该集合。Tom Kyte在他的讨论中有一个这样的例子 假设您从该线程创建myTableType类型和in_list函数,您应该能够
SELECT *
FROM employee
WHERE employee_number IN (
SELECT *
FROM TABLE( in_list( p_your_comma_separated_list ) )
)
纯SQL,但没有经过很好的测试
select to_number(substr(postfix, 2, instr(postfix, ',' ,2)-2)) id
from (
select substr(val, instr(val, ',', 1, n)) postfix
from (select ',101,102,103,' val from dual)
, (
select level n
from dual
connect by level < 10)
where instr(val, ',', 1, n) > 0)
where instr(postfix, ',' ,2)> 2;
注:
使用逗号对字符串进行预/后修复
根据您在改进版本中不需要的需求,采用示例中的上限10。
使用Justing Cave提到的in_list table函数,这可能更好:
信贷:斯蒂芬·法鲁尔(Stephane Faroult)在《重构SQL应用程序》一书中提到了类似的内容,O'Reilly由于逗号分隔的值只包含数字,为什么不尝试使用以下简单方法:
INSTR(','||my_csv_list_of_values||',', ','||my_search_value||',') <> 0
如果将整个select格式化为字符串,则可以使用REPLACE和IN方法,然后将该字符串与OPEN refcursor FOR或EXECUTE IMMEDIATE一起使用。可以使用regexp\u substr函数获得预期的输出。例如 姓名:=“史密斯、艾伦、沃德、琼斯”;-此处名称是可在子句中使用的预期输入的变量/结果
SQL> select regexp_substr(NAMES,'[^,]+', 1, level) from dual 2 connect by regexp_substr(NAMES, '[^,]+', 1, level) is not null;
REGEXP_SUBSTR('SMITH,A
----------------------
SMITH
ALLEN
WARD
JONES
上面的查询遍历逗号分隔的字符串,搜索逗号,然后通过将逗号视为分隔符来拆分字符串。每当碰到分隔符时,它将字符串作为行返回。
这是一份参考资料
列表中的ID数量有限吗?你好,贾斯汀,谢谢你的建议。不幸的是,我无法访问数据库来更改或创建任何内容。我只有读取权限,因此我只能选择。你好,马库斯,谢谢。您使用纯sql提供的解决方案工作得非常好。谢谢你和贾斯汀的帮助。
-- some test data
with employee as (
select 101 as employee_number from dual
union select 200 from dual
union select 10 from dual
union select 102 from dual)
-- the actual query
select * from employee
where INSTR(','||'101,102,103,104'||',', ','||employee_number||',') <> 0;
-- ^^^^^^^^^^^^^^^^^
-- your CSV data
EMPLOYEE_NUMBER
101
102
SQL> select regexp_substr(NAMES,'[^,]+', 1, level) from dual 2 connect by regexp_substr(NAMES, '[^,]+', 1, level) is not null;
REGEXP_SUBSTR('SMITH,A
----------------------
SMITH
ALLEN
WARD
JONES
SQL> select * from emp where ename in (
2 select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
3 connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null );
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20