Как добавить sql «МЕЖДУ» условиями внутри CASE в ПРЕДЛОЖЕНИИ WHERE в SQL

#sql #case #where-clause #between

#sql #кейс #где-предложение #между

Вопрос:

У меня есть sql-запрос, в котором мне нужно добавить разные операторы (между операторами) в предложение where на основе одного условия. Если TX.APPLICATION_ID равен ‘CONV’, то мне нужно добавить диапазон дат фильтра в SYS_CREATION_DATE, а если APPLICATION_ID не равен ‘CONV’, то мне нужно добавить диапазон дат фильтра в TRANS_DATE. Вот что я пытаюсь сделать и получаю ошибку «отсутствует ключевое слово». пожалуйста, предложите

 WHERE TX.TRANS_TYPE IN ('CREDIT', 'CREDITR','CREDITR9', 'DSPJUS')  
  AND 
    CASE
    WHEN TRIM(TX.APPLICATION_ID) = 'CONV' 
    THEN 
      TX.SYS_CREATION_DATE  BETWEEN  TO_DATE('20200831', 'YYYYMMDD')  AND  TO_DATE('20200831', 'YYYYMMDD')
    ELSE 
       TX.TRANS_DATE BETWEEN TO_DATE('20200831', 'YYYYMMDD') AND TO_DATE('20200831', 'YYYYMMDD')
    END
 

Комментарии:

1. Не думайте CASE . Просто попробуйте составить свои условия вместе, используя логическую логику, И , ИЛИ, НЕТ. Вы не можете использовать CASE для внезапной замены в произвольных частях инструкции.

Ответ №1:

Вы должны удалить CASE логику выражения, которая обычно никогда не входит в WHERE предложение. Вместо этого используйте vanilla AND / OR :

 WHERE
    TX.TRANS_TYPE IN ('CREDIT', 'CREDITR','CREDITR9', 'DSPJUS') AND (
    (
        TRIM(TX.APPLICATION_ID) = 'CONV' AND
        TX.SYS_CREATION_DATE >= date '20200831' AND
        TX.SYS_CREATION_DATE < date '20200901'
    )
    OR
    (
        TRIM(TX.APPLICATION_ID) <> 'CONV' AND
        TX.TRANS_DATE >= date '20200831' AND
        TX.TRANS_DATE < date '20200901'
    ))
 

Комментарии:

1. Спасибо, Тим. Этот синтаксис работает 🙂 Но не могли бы вы, пожалуйста, подсказать, не рекомендуется ли использовать case в предложении where?

2. Выражения @Venkat Well CASE предназначены для генерации новых значений из заданного входного значения. Итак, общий вариант использования заключается в том, что вы вводите некоторое значение столбца и получаете несколько возможных значений. В WHERE предложении вы в основном хотите проверять логические условия, а не генерировать новые значения.

3. @Venkat . . . case выражения обеспечивают соблюдение порядка вычисления. Это затрудняло оптимизатор, который часто фокусируется на фильтрации в where предложении.