SQL 服务器:长 CASE 语句的替代方案

SQL Server: Alternative of long CASE statement

我有一个很长的 CASE 语句,它使查询变得很长。有替代方法吗?长 CASE 语句会影响性能吗?我看到人们推荐 COALESCE 但我不确定这是否是我查询中的一个好的选择。

下面的示例中,a、b、c、d、e、f 是来自 table 的列,但我只是使用此处的字母作为示例。

UPDATE table
SET totalAmt = CASE   
                 WHEN product_id = 1  THEN a*b*c*d
                 WHEN product_id = 2  THEN c*d*e + 1
                 WHEN product_id = 3  
                   THEN 
                     CASE WHEN term = 12 THEN b*c*d*e ELSE a*b*e*f END
                 WHEN product_id = 4   THEN a+b+c+d
                 etc.....
               END
FROM table

Is there an alternative way?

通常我会推荐查找 table 和 JOIN,但这只适用于简单的替换(WHEN product_id = 1 THEN 'name'),而不是计算。

您也可以将其拆分为 ..f 六个带有 WHERE product_id = x 的 UPDATE 语句,然后测试上述 UPDATE 和六个单独的 UPDATE 的性能差异。副手虽然我没有看到任何好处,除非我们谈论大量的行。

我预计 CASE 语句本身不会出现任何性能问题。由于您的一个查询是对数据进行一次传递,因此它可能比针对每个产品 ID 的多个查询执行得更好。

如果使用 WHERE 子句,查询可能会执行得更好——如果您的长查询甚至可以做到这一点。

如果 table 很大,并且按产品 ID 索引,并且查询正在更新一小部分产品,则将查询拆分为单独的 UPDATE 可能会获得更好的性能每个 product_id 的查询。否则你可能会在一个巨大的 table 上进行 table 扫描。例如:

UPDATE table SET totalAmt = a*b*c*d WHERE product_id = 1
UPDATE table SET totalAmt = c*d*e + 1 WHERE product_id = 2

如果所有的情况都依赖于product_id,那么你可以将语法缩写成这样:

CASE product_id
    WHEN 1 THEN a*b*c*d
    WHEN 2 THEN ...
END

我建议使用注释来提高代码的可读性。例如,如果产品是一组硬编码的已知 ID,您可以指定它们是什么。同样,解释一下计算可能有助于以后的代码维护:

UPDATE table
SET totalAmt =
    CASE WHEN product_id = 1 -- table
    THEN a*b*c*d             -- some explanation of calculation
    CASE WHEN product_id = 2 -- chair
    THEN ...

如果UPDATE不需要对每条记录都运行,可以用WHERE过滤。至于你的 CASE 表达式,没有想到,我出于自己的喜好取出了嵌套的 CASE ,但不要认为它有任何性能影响:

UPDATE table
SET totalAmt = CASE WHEN product_id = 1 THEN a*b*c*d
                    WHEN product_id = 2 THEN c*d*e + 1
                    WHEN product_id = 3 AND term = 12 THEN b*c*d*e 
                    WHEN product_id = 3 THEN a*b*e*f
                    WHEN product_id = 4 THEN a+b+c+d
                 etc.....
               END
FROM table
WHERE product_id IN (1,2,3,4)