SQL Server 2017:避免重复长表达式替换负值
解决方案
针对你遇到的问题,在SQL Server 2017中有以下几种可行的方式,既不用重复写长表达式,也能实现负数转0的逻辑:
1. 使用CROSS APPLY(推荐)
通过CROSS APPLY预先计算一次长表达式的结果,后续直接引用这个结果即可,完全避免重复编写长表达式,且性能不受影响:
SELECT CASE WHEN expr.CalculatedVal < 0 THEN 0 ELSE expr.CalculatedVal END FROM YourTable CROSS APPLY ( SELECT {你的长表达式} AS CalculatedVal ) AS expr
2. 自定义标量函数(适合频繁复用场景)
如果这个“将负数替换为0”的逻辑需要多次使用,可以创建一个自定义函数,用法和你期望的ISNEGATIVE一致:
CREATE FUNCTION dbo.ISNEGATIVE(@input NUMERIC(38,10), @replaceVal NUMERIC(38,10)) RETURNS NUMERIC(38,10) AS BEGIN RETURN CASE WHEN @input < 0 THEN @replaceVal ELSE @input END END
创建完成后,即可直接调用:
SELECT dbo.ISNEGATIVE({你的长表达式}, 0)
注意:标量函数在处理大数据量时可能存在性能瓶颈,数据量较大时优先选择第一种方案。
3. 利用MAX函数构造取值逻辑
通过构造包含长表达式和0的临时值集合,取最大值来自动替换负数为0,写法较为简洁:
SELECT (SELECT MAX(val) FROM (VALUES ({你的长表达式}), (0)) AS TempVals(val))
内容的提问来源于stack exchange,提问作者Jim 88888
相关产品推荐
相关产品推荐

