2010-05-27 81 views

回答

22
CASE WHEN ISNULL(SUM(MyTable.Total), 0) <= 0 THEN 0 
    ELSE SUM(MyTable.Total) 
END AS Total 
6
CASE 
WHEN COALESCE(SUM(MyTable.Total), 0) <= 0 THEN 0 
ELSE SUM(MyTable.Total) 
END AS [Total] 
1
CASE WHEN 
    COALESCE(SUM(MyTable.Total),0) <= 0 
THEN 
    0 
ELSE 
    SUM(MyTable.Total) 
END AS Total 
+0

当然,这并不尽SUM在其他情况下... Tsk tsk tsk – Cobusve 2010-05-27 15:46:23

0

如何

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

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

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

然后可以与壳体做小于0如上述,从而

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

PostgreSQL里,因为没有IS NULL功能,你可以这样做:

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

@ SQL.NET战士,我创建了一个功能,为您服务。它将一个整数作为参数,并为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 
-3
select greatest(0, -1) FROM DUMMY 

返回0

select greatest(0, 1) FROM DUMMY 

它返回1

+0

_greatest_不存在于SQL Server中 – badbod99 2015-01-07 14:34:26

4

只要是不同的......

ISNULL(SUM(Total) * NULLIF(SIGN(SUM(Total)), -1), 0) 
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