我有一个很长的CASE语句,它使查询很长。还有其他方法吗?长的CASE语句会影响性能吗?我看到有人建议使用COALESCE,但不确定在我的查询中这是否是一个很好的选择。

下面的示例a,b,c,d,e,f是表中的列,但我仅在此处使用字母作为示例。

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

最佳答案

我不希望CASE语句本身有任何性能问题。由于您的一个查询正在对数据进行一次传递,因此对于每个产品ID,它的性能可能比多次查询要好得多。

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

如果表很大,并且按产品ID进行索引,并且查询正在更新一小部分产品,则可能会获得更好的性能,将查询分为每个product_id分开的UPDATE查询。否则,您可能最终会对一个巨大的表进行表扫描。例如:

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 ...

关于sql - SQL Server:长CASE语句的替代方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28838994/

10-13 03:34