【问题标题】:oracle 10g IN clause queryoracle 10g IN子句查询
【发布时间】:2011-07-21 12:07:02
【问题描述】:

请忽略以下明显的语法缺陷:

我有一个这样的 sql 作为命名查询:

select saalry from emp where emp_id in (:id)

id 是 number 类型 我想传入一个逗号分隔的列表,如下所示:

String id = 121,123,456

但我收到了ORA-01722: invalid number 如何将逗号分隔的 id 列表传递给我的 IN 子句?

【问题讨论】:

  • 你说 id is of type number 但你将它作为字符串传递。

标签: oracle oracle10g ora-01722


【解决方案1】:

假设:id 是一个包含相对较短的以逗号分隔的数字列表的字符串(例如'123,456,789'),这对您来说可能就足够了:

select saalry from emp
where INSTR( ',' || :id || ','
           , ',' || TRIM(TO_CHAR(emp_id)) || ','
           ) > 0;

但是,它的性能不会那么好,因为它不太可能在 emp_id 上使用索引。

【讨论】:

  • 答案已经足够好了,虽然我会使用集合和 TABLE 运算符,所以可以使用索引。
【解决方案2】:

还有另一种方式,来自http://blogs.oracle.com/aramamoo/entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement

他们的例子是

select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null;

可以放在in子句中

 select * from emp where ename in (
   select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
   connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null );

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2013-10-31
    • 1970-01-01
    相关资源
    最近更新 更多