ORACLE在IN语句中替换变量

时间:2015-01-12 09:01:55

标签: sql oracle

我有简单的查询,如

SELECT * FROM temp t WHERE t.id IN (:IDs)

执行时,如果ID变量,它会提示我(Oracle SQL Developer)输入值。

当我输入示例169时,一切都运行顺利,但是当我尝试输入多个ID,例如169,170,171时,即使将其放入'',我也会收到错误无效数字。

我习惯使用MS SQL和MySQL,所以这对我来说有点困惑。

任何人有任何建议。

3 个答案:

答案 0 :(得分:2)

问题是varying-IN list。在SQL Developer中,当系统提示您输入绑定变量的值时,您可以将其简单地传递为169,170,171,而不将其视为set of values

你可以做的是,有多重绑定 -

SELECT * FROM temp t WHERE t.id IN (:ID1, :ID2)

出现提示时,输入每个绑定的值。

更新好的,如果上面的解决方案看起来很难看,那么我更倾向于以下解决方案 -

WITH DATA AS
  (SELECT to_number(trim(regexp_substr(:ids, '[^,]+', 1, LEVEL))) ids
  FROM dual
    CONNECT BY instr(:ids, ',', 1, LEVEL - 1) > 0
  )
SELECT * FROM temp t WHERE it.d IN
  (SELECT ids FROM data
  )
/

答案 1 :(得分:0)

如果你把它们放进“,就会出错.Oracle不接受”。你应该只用数字而不是“。 即:(169,170,171,...)

答案 2 :(得分:0)

您可以将替换变量定义为数组,如下所示:

define IDS = (169,170,171);

然后像这样使用它:

SELECT * FROM temp t WHERE t.id IN &IDS;