Search code examples
sqlsql-servercase

SQL Syntax for CASE command with multiple WHEN value


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 ?


Solution

  • 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