【问题标题】:Return zero if value less than zero [duplicate]如果值小于零,则返回零 [重复]
【发布时间】:2016-05-30 20:43:24
【问题描述】:

如果值小于零,是否可以在不使用 case 语句的情况下返回零?

例如Max(a, 0)

我希望我的代码尽可能简洁。

【问题讨论】:

  • 为什么不想使用 case 表达式。这几乎就是他们的目的。
  • 有问题!
  • 问题是什么?
  • 为什么“尽可能简洁”是一个目标? CASE 表达式是自我记录的,你不会从保存角色到更神秘的地方获得奖励积分或提高性能。
  • 0 大于任何负值。 MAX(value, 0) 对我来说很清楚。

标签: sql-server tsql


【解决方案1】:

只是为了好玩:

DECLARE @a INT = -3
SELECT COALESCE(NULLIF (ABS(@a), -@a), 0)

这篇文章只是暗示CASE 表达式是获得预期结果的更好选择。

NULLIF 毕竟只是一个花哨的CASE。上面的示例查询(在执行计划中)扩展为:

CASE 
    WHEN 
        CASE 
            WHEN abs([@a])=( -[@a]) 
            THEN NULL 
            ELSE abs([@a]) 
        END IS NOT NULL 
    THEN 
        CASE 
            WHEN abs([@a])=( -[@a]) 
            THEN NULL 
            ELSE abs([@a]) 
        END 
    ELSE (0) 
END

一个合适的CASE 表达式:

-- All versions
SELECT CASE WHEN @a > 0 THEN @a ELSE 0 END;

-- SQL Server 2012 or later
SELECT IIF(@a > 0, @a, 0);

【讨论】:

  • @PaulWhite:所以使用这个简单版本的另一个原因:SELECT CASE WHEN @a < 0 THEN 0 ELSE @a END
  • 另一种处理 NULL 的表达式:@A * ( ( Sign( @A ) + 1 ) / 2 )
猜你喜欢
  • 2016-10-26
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多