Can I simplify the below CASE statement, which runs the same correlated subquery twice?
CASE
WHEN (SELECT val1
FROM t1
WHERE out.id = t1.t1
AND condition) IS NULL THEN 0
ELSE (SELECT val1
FROM t1
WHERE out.id = t1.t1
AND condition)
END AS desired_value
In the above code, out is the table being referenced outside the subquery, and the SELECT statement is guaranteed to always give one value or NULL.
Ideally, I would like to have this subquery run only once.
Advertisement
Answer
Using coalesce() doesn’t actually fix the problem (because SQL Server runs the first argument twice when the value is null). . . the correlated query is still run twice. isnull() does fix that problem:
isnull( (SELECT val1
FROM t1
WHERE out.id = t1.t1 AND condition
) , 0
) AS desired_value
Or, you can use an aggregation query:
(SELECT COALESCE(MAX(val1), 0) FROM t1 WHERE out.id = t1.t1 AND condition ) AS desired_value