2010-05-27 8 views

Répondre

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

Bien sûr, cela ne fait pas le SUM dans l'autre cas ... Tsk tsk tsk – Cobusve

0

que diriez-vousJe préfère cela car l'implémentation NULL dans les bases de données n'est pas toujours logique et diffère entre les fournisseurs et si ANSI_NULLS est activé ou non.

E.g. SUM NULL, NULL et 1 est retourné comme 1, mais (1 + NULL + NULL) est égal à NULL ...

Vous pouvez alors faire moins de 0 avec le CAS comme ci-dessus, ainsi

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

En Postgresql puisqu'il n'y a aucune fonction IS NULL que vous pouvez faire:

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

@ SQL.NET Guerrier, j'ai créé une fonction pour vous. Il prend un entier comme paramètre et retient 0 pour les valeurs NULL ou négatives.

--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 

Il retourne 0

select greatest(0, 1) FROM DUMMY 

Il retourne 1

+0

_greatest_ n'existe pas dans SQL Server – badbod99

4

Juste pour être différent ...

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 
Questions connexes