我有一个非常长的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
答案 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语句以获得性能差异。虽然我没有看到任何好处,但除非我们说的是大量的行。