Oracle SQL多值参数-ORA-00920:无效的关系运算符

问题描述

我有一个带参数v_acct_unit的带有Oracle SQL查询的SSRS报告。此参数可以是单值,多值或null。请参阅下面的3个查询参数。多值参数会给出错误消息。如何解决错误

错误

ORA-00920:无效的关系运算符

ParaMS-1(单个):已选择37行。

DEFINE V_BEG_DATE = "'080120'";
DEFINE V_END_DATE = "'080420'" ;
DEFINE V_ACCT_UNIT = "'0200301'" ;

ParaM-2(空):结果为389行

DEFINE V_BEG_DATE = "'080120'";
DEFINE V_END_DATE = "'080420'" ;
DEFINE V_ACCT_UNIT = NULL ;

ParaM-3(Multi):错误

DEFINE V_BEG_DATE = "'080120'";
DEFINE V_END_DATE = "'080420'" ;
DEFINE V_ACCT_UNIT = "'0100001','0200301','',''" ;

sql

SELECT
    company company,acct_unit acct_unit,description description
FROM
    v_glnames names
WHERE
    ((&v_acct_unit) IS NULL OR acct_unit IN (&v_acct_unit))

解决方法

这是关于 IN 列表中的各种元素。因为它是一个列表,所以不能像使用单个值一样使用它。一种选择是使用层次结构子查询将其拆分为行。这是一个示例:

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: 'KING','','SCOTT',''

ENAME      JOB              SAL
---------- --------- ----------
SCOTT      ANALYST         3000
KING       PRESIDENT      10000

SQL>

根据所使用的工具,参数的引用可能像:par_ename一样简单,但是您应该知道它。


另一个选择可能是:

SQL> select ename,sal
  2  from emp
  3  where ename in (select *
  4                  from table(sys.odcivarchar2list('KING',''))
  5                 );

ENAME      JOB              SAL
---------- --------- ----------
KING       PRESIDENT      10000
SCOTT      ANALYST         3000

SQL>