отсутствует правильная скобка в заявлении - PullRequest
0 голосов
/ 01 ноября 2019

оператор case возвращает пропущенные скобки, когда скобки не нужны

изменил его, чтобы включить в предложение where, но получил ту же ошибку

select tbraccd_pidm, tbraccd_term_code        
from tbraccd 
where (tbraccd_term_code = case tbraccd_term_code
    when (substr(tbraccd_term_code,5,1) = '3') 
        then tbraccd_term_code IN ('201931', '201941') 
        else tbraccd_term_code                         
    end)

1 Ответ

0 голосов
/ 01 ноября 2019

Ваш запрос выглядит неправильно с первого взгляда. Если бы я понял, что вы хотели сделать, то это выглядело бы так:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...