在一个SQL语句中检查值是NULL还是小于0

时间:2010-05-27 10:03:42

标签: sql-server-2005 tsql

ISNULL(SUM(MyTable.Total), 0) AS Total

如何修改上述声明以检查Total是否小于0 (零),以使If Total为NULL或小于0 (负) ,我将0分配给总计

9 个答案:

答案 0 :(得分:23)

CASE WHEN ISNULL(SUM(MyTable.Total), 0) <= 0 THEN 0
     ELSE SUM(MyTable.Total)
END AS Total

答案 1 :(得分:7)

CASE 
WHEN COALESCE(SUM(MyTable.Total), 0) <= 0 THEN 0
ELSE SUM(MyTable.Total)
END AS [Total]

答案 2 :(得分:4)

只是为了与众不同......

ISNULL(SUM(Total) * NULLIF(SIGN(SUM(Total)), -1), 0)

答案 3 :(得分:1)

CASE WHEN 
  COALESCE(SUM(MyTable.Total),0) <= 0 
THEN 
   0 
ELSE 
  SUM(MyTable.Total)
END AS Total

答案 4 :(得分:1)

@ SQL.NET Warrior,我已经为你创建了一个函数。它接受一个整数作为参数,并为NULL或负值返回0。

--this statements ensure we drop the function before recreating it
IF EXISTS(SELECT * FROM sysobjects WHERE xtype = 'FN' AND name = 'nonNullNegative')
BEGIN
    DROP FUNCTION dbo.nonNullNegative
END
GO

--the real function definition
CREATE FUNCTION dbo.nonNullNegative(@numValue INT)
RETURNS INT
AS
BEGIN
  DECLARE @newValue AS INT; 
    SET @newValue= CASE WHEN ISNULL(@numValue,0)<=0 THEN 0 ELSE @numValue
END
    RETURN  @newValue;
END
GO



use MyDatabase;

--use it like this
SELECT dbo.nonNullNegative(-2);--outputs 0

答案 5 :(得分:0)

怎么样

SUM(ISNULL(MyTable.Total, 0)) AS Total

我更喜欢这个,因为数据库中的NULL实现并不总是逻辑的,并且在供应商之间以及ANSI_NULLS是否启用时会有所不同。

E.g。 NULL,NULL和1的SUM返回为1,但是(1 + NULL + NULL)等于NULL ...

然后您可以使用上述CASE执行小于0,因此

CASE 
WHEN SUM(ISNULL(MyTable.Total,0)) <= 0 THEN 0
ELSE SUM(ISNULL(MyTable.Total,0))
END AS [Total]

答案 6 :(得分:0)

在Postgresql中,因为没有IS NULL功能,你可以这样做:

CASE WHEN SUM(MyTable.Total) > 0 THEN SUM(MyTable.Total) ELSE 0 END AS Total

答案 7 :(得分:0)

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Haluk Alkın Turan
-- Create date: 2017-10-31
-- Description: Simulates ORACLE's GREATEST Function
-- Usage: select dbo.getGreatest(1,2)
-- =============================================
CREATE FUNCTION getGreatest
(
    @val1 sql_variant,
    @val2 sql_variant
)
RETURNS sql_variant
AS
BEGIN
    RETURN (SELECT MAX(i) FROM (VALUES (@val1), (@val2)) AS T(i))
END
GO

答案 8 :(得分:-3)

select greatest(0, -1) FROM DUMMY

返回0

select greatest(0, 1) FROM DUMMY

它返回1