使用带有逗号分隔字符串的"IN"子句,该字符串来自Oracle SQL中的replace()函数的输出

Tho*_*mas 8 oracle

我有一个逗号分隔的字符串,我想在语句的"IN"子句中使用它.例如:100,101,102

由于In和"IN"子句我必须引用个别字符串,我使用替换函数:例如:select''''|| replace('100,101,102',',',''',''')|| ''''来自双重;

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

select * from employee where employee_number in (
    select ''''||replace('100,101,102',',',''', ''')||'''' from dual);
Run Code Online (Sandbox Code Playgroud)

以上不起作用.请让我知道我错过了什么.

Jus*_*ave 11

在这种情况下,一般方法是将逗号分隔列表解析为Oracle集合,并在SQL语句中使用该集合.Tom Kyte在他对变量IN列表的讨论中有一个例子.

假设您从该线程创建myTableType类型和in_list函数,您应该可以这样做

SELECT *
  FROM employee
 WHERE employee_number IN (
    SELECT *
      FROM TABLE( in_list( p_your_comma_separated_list ) )
    )
Run Code Online (Sandbox Code Playgroud)


Mar*_*and 5

纯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;
Run Code Online (Sandbox Code Playgroud)

编辑:改进

select substr(postfix, 1, instr(postfix, ',' ,1)-1)
  from (
       select substr(val, instr(val, ',',1, level)+1) postfix
         from (select ',101,102,103,' val from dual)
      connect by instr(val, ',', 2, level) > 0
  );
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 前/后用逗号修复字符串
  • 根据您的需要采用上限(示例中为 10)(改进版本中不需要)。
  • 使用 Justing Cave 提到的 in_list 表函数,这可能更好:)

信用:Stephane Faroult 的书“重构 SQL 应用程序”(O'Reilly)中有类似的内容