Reputation: 1
I have a sql query where I need to add different statements(between statements) in where clause based on one condition. If TX.APPLICATION_ID is 'CONV' then I need to add filter date range on SYS_CREATION_DATE and if APPLICATION_ID is not 'CONV' then I need to add filter date range on TRANS_DATE. Here is what i'm trying and getting 'missing keyword' error. please suggest
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
Upvotes: 0
Views: 420
Reputation: 521864
You should remove the CASE
expression logic, which generally never belongs in the WHERE
clause. Instead, use 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'
))
Upvotes: 1