在 Oracle IN 子句中使用替换变量

米拉吉·莫哈吉林

我正在尝试编写一个简单的查询,其中要求使用替换变量,该变量可用于为用于过滤查询的列输入多个可能的值。

要求是生成以下查询

select
CONTRACT, 
ORDER_NO,
CUSTOMER_NO
from CUSTOMER_ORDER
where state='Picked'
and contract in ('ABC','DEF')

但是需要在运行时通过替换变量输入合约值。我正在处理只能编写静态 SQL 查询(“select ..from..where..”)的限制,并且不能在 pl sql 块中编写动态代码。

所以,我尝试的是以下内容,

select
CONTRACT, 
ORDER_NO,
CUSTOMER_NO
from CUSTOMER_ORDER_JOIN
where contract in (select '''' || REPLACE('&CONTRACT',';',''',''') || '''' from dual)

当出现替换提示时,我输入 ABC;DEF

但这似乎不起作用。虽然当我单独运行以下时,

select '''' || REPLACE('&CONTRACT',';',''',''') || '''' from dual

我得到 'ABC','DEF' 结果。

为什么这不起作用?有没有办法达到我想要的结果?

谢谢

小脚怪

一种选择是将这些值拆分为行并将它们用作子查询。

基于 Scott 的 EMP 表的示例:

SQL> select ename, job, sal from emp;

ENAME      JOB              SAL
---------- --------- ----------
SMITH      CLERK            920
ALLEN      SALESMAN        1600
WARD       SALESMAN        1250
JONES      MANAGER         2975
MARTIN     SALESMAN        1250
BLAKE      MANAGER         2850
CLARK      MANAGER         2450
SCOTT      ANALYST         3000
KING       PRESIDENT      10000
TURNER     SALESMAN        1500
ADAMS      CLERK           1100
JAMES      CLERK            950
FORD       ANALYST         3000
MILLER     CLERK           1300

14 rows selected.

SQL> select ename, job, sal
  2  from emp
  3  where ename in (select regexp_substr(replace(q'[&&par_ename]', chr(39), ''), '[^,]+', 1, level)
  4                  from dual
  5                  connect by level <= regexp_count(q'[&&par_ename]', ',') + 1
  6                 );
Enter value for par_ename: 'SMITH','ALLEN'

ENAME      JOB              SAL
---------- --------- ----------
SMITH      CLERK            920
ALLEN      SALESMAN        1600

SQL>

或者,使用sys.odcivarchar2list

SQL> select ename, job, sal
  2  from emp
  3  where ename in (select column_value
  4                  from table(sys.odcivarchar2list(&par_ename))
  5                 );
Enter value for par_ename: 'SMITH','ALLEN'

ENAME      JOB              SAL
---------- --------- ----------
SMITH      CLERK            920
ALLEN      SALESMAN        1600

SQL>

它也可以在没有单引号的情况下工作:

SQL> Select ename, job, sal
  2      from emp
  3      where ename in (select regexp_substr(replace(q'[&&par_ename]', chr(39), ''), '[^,]+', 1, level)
  4                      from dual
  5                      connect by level <= regexp_count(q'[&&par_ename]', ',') + 1
  6                     );
Enter value for par_ename: SMITH,ALLEN,KING

ENAME      JOB              SAL
---------- --------- ----------
SMITH      CLERK            920
ALLEN      SALESMAN        1600
KING       PRESIDENT      10000

SQL>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Oracle的Where子句中使用案例

Oracle-在动态游标的LIKE子句中使用绑定变量

Oracle SQL-在Have子句中使用ROWNUM分组?

在where子句中使用嵌套表值(oracle)

在Oracle SQL Developer的视图的WHERE子句中使用USER

在 Oracle SQL 的 Where 子句中使用 Case 语句

在 Oracle 12c 的 WHERE 子句中使用 CASE

Oracle group by子句在select语句中使用嵌套函数

如何在where子句中使用Oracle的解码功能

SQL Oracle - Where 子句中的替换函数

HAVING子句中的Oracle PL / SQL变量

Oracle-在SELECT语句中使用变量

在where子句中连接并使用oracle plsql

在Oracle Where子句中使用Timestamp数据类型搜索数据

ORACLE SQL-在WHERE子句中使用带有GROUP BY无效标识符的SUM

为什么可以在WHERE子句中使用别名?(Oracle XE 11g)

如何在where子句中使用多个参数将Oracle转换为MS SQL?

Oracle:声明多个常量并在 WHERE 子句中使用它们

Oracle LAST_VALUE仅在分析子句中使用order by

在查询Oracle 12.1中的WITH子句中使用CURSOR表达式

Oracle:我可以在 where 子句中使用 case 与列值进行比较吗

EntityFramework 和 oracle 包含在 Where 子句中不能与变量一起使用

如何在FROM子句中使用CASE语句来决定使用哪个表来获取Oracle中的数据?

Oracle - IF 子句中的子查询

Oracle子句中的日期比较

在 XMLTABLE (Oracle) 中使用 xmlnamesspaces 子句

如何在Oracle SQL中使用by by子句

在 Oracle 的 SELECT 语句中使用索引

如何从oracle 11g中的日期比较月和日的值并在where子句中使用它?