web-dev-qa-db-fra.com

vérifie si une valeur est NULL ou inférieure à une instruction SQL

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

Comment puis-je modifier l'instruction ci-dessus pour vérifier également si Total est inférieur à 0 (zéro) , tel que Si Total est NULL ou inférieur à 0 (négatif) , j'affecte 0 à Total  

15
StackTrace
CASE WHEN ISNULL(SUM(MyTable.Total), 0) <= 0 THEN 0
     ELSE SUM(MyTable.Total)
END AS Total
23
lc.
CASE 
WHEN COALESCE(SUM(MyTable.Total), 0) <= 0 THEN 0
ELSE SUM(MyTable.Total)
END AS [Total]
7
Neil Knight

Juste pour être différent ...

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

@ SQL.NET Warrior, j'ai créé une fonction pour vous. Il prend un entier en paramètre et répète 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
1
oabarca
CASE WHEN 
  COALESCE(SUM(MyTable.Total),0) <= 0 
THEN 
   0 
ELSE 
  SUM(MyTable.Total)
END AS Total
1
Paul Alan Taylor
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
0
Haluk Alkin TURAN

Dans Postgresql puisqu'il n'y a pas de fonction IS NULL, vous pouvez faire:

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

Que diriez-vous 

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

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

Par exemple. SOMME de NULL, NULL et 1 est renvoyé à 1, mais (1 + NULL + NULL) est égal à NULL ...

Vous pouvez alors faire le moins que 0 avec le CASE comme ci-dessus, donc

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