2016-02-18 401 views
0

如果值不小于零而不使用case语句,是否可以返回零?如果值小于零,则返回零

例如最大(a,0)< - '最大'不存在。

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

+6

为什么你不希望使用的情况下表达。这几乎是他们所做的。 –

+0

它的问题! –

+0

另请参见:[在SQL Server 2008中的函数类似于MySQL中的GREATEST?](http://stackoverflow.com/questions/4725823/function-in-sql-server-2008-similar-to-greatest-in-mysql) –

回答

12

只是为了好玩:

DECLARE @a INT = -3 
SELECT COALESCE(NULLIF (ABS(@a), [email protected]), 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); 
+0

@PaulWhite:使用这个简单版本的另一个原因是:'SELECT CASE WHEN @a <0 THEN 0 ELSE @a END' –

+1

@TimSchmelter是的,虽然要小心正确处理NULL输入。 (我认为结果应该是0,而不是NULL)。 –

+0

处理NULL的替代表达式:'@A *((Sign(@A)+ 1)/ 2)' – HABO