SQL Server:长CASE语句的替代

时间:2015-03-03 18:14:59

标签: sql sql-server-2008

我有一个非常长的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

3 个答案:

答案 0 :(得分:4)

我不希望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 ...

答案 1 :(得分:1)

如果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)

答案 2 :(得分:0)

  

还有另一种方法吗?

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

您还可以使用WHERE product_id = x将其拆分为a..f六个UPDATE语句,然后测试上面的UPDATE以及六个单独的UPDATE语句以获得性能差异。虽然我没有看到任何好处,但除非我们说的是大量的行。