通过相关子查询简化CASE语句

时间:2019-09-05 15:22:14

标签: sql sql-server

我可以简化下面的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

理想情况下,我希望此子查询仅运行一次。

2 个答案:

答案 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