Случай, когда SQLPL - PullRequest
       4

Случай, когда SQLPL

0 голосов
/ 29 октября 2019

Ошибка отсутствует правая скобка

select
    case when TO_CHAR (current_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'TUE' then
        (select * from CUSTOMER_ORDER_JOIN 
         where
             PLANNED_DUE_DATE between to_date(current_date +1) and to_date(current_date + 3)
             and customer_no not in ('1000' '2000')
             and state not in( 'Delivered'))
    else 
        (select * from CUSTOMER_ORDER_JOIN
         where
             PLANNED_DUE_DATE  between to_date(current_date - 1) and to_date(current_date + 1)
             and customer_no not in ('1000', '2000')
             and state not in( 'Delivered'))
    end 
from dual

Ошибка отсутствует правая скобка.

Ответы [ 2 ]

1 голос
/ 29 октября 2019

У вас не может быть оператора case, который запускает один из двух операторов select. Таким образом, основная структура того, что у вас есть, не сработает. Этот код находится в процедуре (или другом блоке PL / SQL), где current_date является локальной переменной? Если это так, вы потенциально хотите вместо этого IF оператор. Потенциально, вы просто хотите один запрос с OR предложением

select * 
  from CUSTOMER_ORDER_JOIN
 where ((    TO_CHAR (current_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'TUE' 
         and PLANNED_DUE_DATE  between to_date(current_date + 1)
                                   and to_date(current_date + 3)) 
        OR
        (    TO_CHAR (current_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') != 'TUE' 
         and PLANNED_DUE_DATE  between to_date(current_date - 1)
                                   and to_date(current_date + 1)))
  and customer_no not in ('1000', '2000')
  and state not in( 'Delivered')

Хотя я не изменил его, очень маловероятно, что вы действительно хотите to_date( current_date + n) в своем коде. Предполагая, что current_date является date, вызов to_date в идеале ничего не делает, но потенциально вызывает сбои, неявно приводя date к varchar2 только для явного преобразования обратно в date. Это может произойти сбой в зависимости от таких параметров, как настройки NLS сеанса. Если current_date содержит компонент, не относящийся к полуночи, который вы пытаетесь игнорировать, вы реально хотите вместо него trunc(current_date) + n.

1 голос
/ 29 октября 2019

Вам не хватает запятой здесь

in ('1000' '2000')

это должно быть

in ('1000', '2000')

Поскольку подвыборы дают значение для столбца в наборе результатов, вынеобходимо выбрать один столбец вместо *. case when должен выбрать одно значение. Вы не можете вернуть его более чем в один столбец.


Поскольку оба подзапроса выбираются из одного источника, я бы использовал один select и поместил всю логику в предложение where. См. Ответ Джастина Кейва.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...