#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
предложении.