How can I change NULL to 0 when getting a single value from a SQL function?

前端 未结 8 828
刺人心
刺人心 2021-02-06 20:02

I have a query that counts the price of all items between two dates. Here is the select statement:

SELECT SUM(Price) AS TotalPrice 
FROM Inventory
WHERE (DateAdd         


        
相关标签:
8条回答
  • 2021-02-06 20:41
    SELECT COALESCE(
        (SELECT SUM(Price) AS TotalPrice 
        FROM Inventory
        WHERE (DateAdded BETWEEN @StartDate AND @EndDate))
        , 0)
    

    If the table has rows in the response it returns the SUM(Price). If the SUM is NULL or there are no rows it will return 0.

    Putting COALESCE(SUM(Price), 0) does NOT work in MSSQL if no rows are found.

    0 讨论(0)
  • 2021-02-06 20:46

    Most database servers have a COALESCE function, which will return the first argument that is non-null, so the following should do what you want:

    SELECT COALESCE(SUM(Price),0) AS TotalPrice
    FROM Inventory
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
    

    Since there seems to be a lot of discussion about

    COALESCE/ISNULL will still return NULL if no rows match, try this query you can copy-and-paste into SQL Server directly as-is:

    SELECT coalesce(SUM(column_id),0) AS TotalPrice 
    FROM sys.columns
    WHERE (object_id BETWEEN -1 AND -2)
    

    Note that the where clause excludes all the rows from sys.columns from consideration, but the 'sum' operator still results in a single row being returned that is null, which coalesce fixes to be a single row with a 0.

    0 讨论(0)
  • 2021-02-06 20:51

    You could use

    SELECT ISNULL(SUM(ISNULL(Price, 0)), 0).

    I'm 99% sure that will work.

    0 讨论(0)
  • 2021-02-06 20:56
    SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice
    FROM Inventory
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
    
    0 讨论(0)
  • 2021-02-06 20:56

    ORACLE/PLSQL:

    NVL FUNCTION

    SELECT NVL(SUM(Price), 0) AS TotalPrice 
    FROM Inventory
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
    

    This SQL statement would return 0 if the SUM(Price) returned a null value. Otherwise, it would return the SUM(Price) value.

    0 讨论(0)
  • 2021-02-06 21:00

    Edit: Looks like everyone else beat me to it haha

    Found the answer.

    ISNULL() determines what to do when you have a null value.

    In this case my function returns a null value so I needed specify a 0 to be returned instead.

    SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
    FROM Inventory
    WHERE (DateAdded 
    BETWEEN @StartDate AND @EndDate)
    
    0 讨论(0)
提交回复
热议问题