TL/DR Is it possible to use "IN" syntax after "WHEN" if the condition is at CASE level ?
My scenario :
I am writing a SQL CASE statement with multiple WHEN value validation. The CASE condition is complex (and long) so i don't want to repeat it at WHEN level.
This works :
CASE
WHEN ( SELECT VALUE FROM Tab1 INNER JOIN Tab2 ON Tab1 ....very long statement) IN ('A','B','C') THEN 1
WHEN ( same very long statement as above) IN ('D','E','F') THEN 2
WHEN ( same very long statement as above) IN ... etc
END
I would like to make it more readable as this, but syntax below fails
CASE ( SELECT VALUE FROM Tab1 INNER JOIN Tab2 ON Tab1 ....very long statement)
WHEN IN ('A','B','C') THEN 1 -- fails syntax error
WHEN 'D' OR 'E' OR 'F' THEN 2 -- also fails syntax error
END
Of course i am trying to avoid listing all values with same outcome in different when Syntax below works but very long list of values
CASE ( SELECT VALUE FROM Tab1 INNER JOIN Tab2 ON Tab1 ....very long statement)
WHEN 'A' THEN 1
WHEN 'B' THEN 1
WHEN 'C' THEN 1
WHEN 'D' THEN 2
WHEN 'E' THEN 2
WHEN 'F' THEN 2
....
END
What can SQL do for me there ?
Formulate the long query as you did, and CROSS JOIN the main query with it:
SELECT
base_query.other
, base_query.columns
, base_query.otherquery
, CASE
WHEN xcross.result IN ('A','B','C') THEN 1
WHEN xcross.result IN ('D','E','F') THEN 2
WHEN xcross.result IN ('G','H','I') THEN 3
ELSE NULL
END
FROM other_table ot
JOIN yet_other_table you on ot.join_col = yot.join_col
CROSS JOIN (
SELECT val AS result FROM Tab1 INNER JOIN Tab2 ON Tab1 ....very long statement
) AS xcross