我可以简化下面的CASE
语句,该语句运行相同的相关子查询两次吗?
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
在上面的代码中,out
是在子查询之外被引用的表,并且保证SELECT
语句始终提供一个值或NULL
。
理想情况下,我希望此子查询仅运行一次。
答案 0 :(得分:1)
使用coalesce()
并不能真正解决问题(因为SQL Server在值为null
时将第一个参数运行两次)。 。 。相关查询仍然运行两次。 isnull()
确实解决了该问题:
isnull( (SELECT val1
FROM t1
WHERE out.id = t1.t1 AND condition
) , 0
) AS desired_value
或者,您可以使用聚合查询:
(SELECT COALESCE(MAX(val1), 0)
FROM t1
WHERE out.id = t1.t1 AND condition
) AS desired_value
答案 1 :(得分:0)
您肯定在查询的FROM子句中有“ out”表,因此请尝试完全摆脱子查询:
SELECT ISNULL(t1.val1, 0) as desired_value
FROM out
LEFT JOIN t1 on out.id = t1.t1 AND condition