从Oracle SQL中的replace()函数的输出中使用带有逗号分隔字符串的“IN”子句

从Oracle SQL中的replace()函数的输出中使用带有逗号分隔字符串的“IN”子句,oracle,Oracle,我有一个逗号分隔的字符串,我想在语句的in子句中使用它。 例:100101102 由于In和In子句中必须引用单个字符串,因此我使用替换函数: 例如:从dual中选择| |替换'100101102'、'、'、'、'、'| | 但是,当我尝试使用上面的输出作为IN子句的输入时,上面的查询是有效的,它不返回任何数据。我只受SQL语句的限制,所以不能使用PL/SQL代码。请帮忙 select * from employee where employee_number in ( select '

我有一个逗号分隔的字符串,我想在语句的in子句中使用它。 例:100101102

由于In和In子句中必须引用单个字符串,因此我使用替换函数: 例如:从dual中选择| |替换'100101102'、'、'、'、'、'| |

但是,当我尝试使用上面的输出作为IN子句的输入时,上面的查询是有效的,它不返回任何数据。我只受SQL语句的限制,所以不能使用PL/SQL代码。请帮忙

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