如何在ORACLE SQL中将变量/参数与IN子句一起使用

时间:2019-05-28 08:36:43

标签: oracle oracle-sqldeveloper

我有一个简单的选择查询:

SELECT A
FROM B
WHERE A IN :conditions

其中Achar

如果我按照以下方式进行完整查询:

SELECT A
FROM B
WHERE A IN ('A','E','I','O','U')

有效

但是如果我使用该参数,当我尝试使用ORACLE SQL Developer执行时,我将无法使其正常工作。

我已经尝试将参数提交为:

1* ('A','E','I','O','U')
2* 'A','E','I','O','U'
3* A,E,I,O,U

查询不返回结果

这样做的正确语法是什么?

谢谢大家

3 个答案:

答案 0 :(得分:0)

您可以在SQL Developer(或SQL * Plus)中使用替换变量。定义时使用双引号。

测试数据

create table b as select 'A' as a from dual union all 
select 'I' as a from dual union all
select 'U' as a from dual

执行

define params = "'A','E','I','O','U'"
select A from B where A in (&params);

结果

old:select A from B where A in (&params)
new:select A from B where A in ('A','E','I','O','U')

A
-
A
I
U

答案 1 :(得分:0)

Passing comma separated string as bind variable for VO query's IN operator

这个问题困扰了我多年,直到我发现此解决方案。

我使用这种技术在CLI上建立了对象搜索,然后在其中将模式列表传递给:BIND

SELECT owner,
       object_name,
       object_type
  FROM all_objects
 WHERE object_name LIKE :SEARCH
   AND owner NOT IN (
    'SYS',
    'MDSYS',
    'DBSNMP',
    'SYSTEM',
    'DVSYS',
    'APEX_050100',
    'PUBLIC',
    'ORDS_METADATA',
    'APEX_LISTENER'
)
   AND object_type IN (
    SELECT regexp_substr(:bind_ename_comma_sep_list,'[^,]+',1,level)
      FROM dual CONNECT BY
        regexp_substr(:bind_ename_comma_sep_list,'[^,]+',1,level) IS NOT NULL
)
 ORDER BY owner,
          object_name,
          object_type;

答案 2 :(得分:0)

根据这篇文章,我找到了一种针对Oracle的方法: https://sqlstudies.com/2013/04/08/how-do-i-use-a-variable-in-an-in-clause/

会是这样的:

SELECT A
FROM B
WHERE ',' || :conditions || ',' LIKE '%,' || A || ',%'

可能不是最佳性能选项,但可以解决问题