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)
我有一个很长的 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)