Ваш запрос выглядит неправильно с первого взгляда. Если бы я понял, что вы хотели сделать, то это выглядело бы так:
select tbraccd_pidm, tbraccd_term_code
from tbraccd
where tbraccd_term_code = case when substr(tbraccd_term_code, 5, 1) = '3' then ('201931', '201941')
else tbraccd_term_code
end
Хотя это выглядит красивее , он потерпит неудачу по той же причине, что и ваша, без разницы. Почему? Потому что вы не можете использовать IN таким образом;Дело не позволит. Если бы это было, например,
case when substr(tbraccd_term_code, 5, 1) = '3' then '201931'
, тогда все было бы в порядке. Но, очевидно, вам нужны оба значения.
У меня нет ни вашей таблицы, ни данных, поэтому я переключусь на примеры таблиц Скотта EMP и DEPT, пытаясь проиллюстрировать, что вы можете попытаться сделать.
Во-первых, запрос, который имитирует ваш. SQL * Plus покажет, что с ним не так (обратите внимание на знак *
под строкой № 5):
SQL> select empno, ename, job
2 from emp e
3 where e.deptno in case when substr(e.ename, 1, 1) = 'S' then (10, 20)
4 else 30
5 end;
where e.deptno in case when substr(e.ename, 1, 1) = 'S' then (10, 20)
*
ERROR at line 3:
ORA-00907: missing right parenthesis
Как переписать его, чтобы он работал? Например, вот так:
SQL> select e.empno, e.ename, e.job
2 from emp e
3 where e.deptno in (select e1.deptno from emp e1
4 where e1.deptno in (10, 20)
5 and substr(e.ename, 1, 1) = 'S' --> this is the 1st CASE's WHEN
6 )
7 or ( e.deptno = 30
8 and substr(e.ename, 1, 1) <> 'S' --> 2nd CASE's WHEN
9 );
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7654 MARTIN SALESMAN
7698 BLAKE MANAGER
7788 SCOTT ANALYST
7844 TURNER SALESMAN
7900 JAMES CLERK
8 rows selected.
SQL>