web-dev-qa-db-ja.com

SQL関数から単一の値を取得するときにNULLを0に変更するにはどうすればよいですか?

2つの日付の間のすべてのアイテムの価格をカウントするクエリがあります。 select文は次のとおりです。

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

すべてのテーブルが適切に設定されていると想定できます。

2つの日付の間で選択を行い、その日付範囲内にアイテムがない場合、関数はTotalPriceとして0ではなくNULLを返します。

レコードが見つからない場合、NULLではなく0が返されることを確認するにはどうすればよいですか?

55
Matt

ほとんどのデータベースサーバーには [〜#〜] coalesce [〜#〜] 関数があり、null以外の最初の引数を返すため、次の操作を行う必要があります。

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

[編集]

「COALESCE/ISNULLは一致する行がない場合でもNULLを返します」について多くの議論があるように見えるので、物事を明確にするために、SQL Serverにそのままコピーアンドペーストできるこのクエリを試してください。

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

Where句はsys.columnsのすべての行を考慮対象から除外しますが、「sum」演算子を使用すると、nullの単一行が返されます。これにより、修正が0の単一行になります。

これが説明に役立つことを願っています。

98
Jonathan Rupp
SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)

これでうまくいくはずです。

13
Joseph
SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
11
BlackTigerX
SELECT COALESCE(
    (SELECT SUM(Price) AS TotalPrice 
    FROM Inventory
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate))
    , 0)

テーブルの応答に行がある場合、SUM(Price)を返します。 SUMがNULLまたは行がない場合、0を返します。

行が見つからない場合、MSSQLではCOALESCE(SUM(Price)、0)を入れても機能しません。

6
Paul

編集:他の誰もが私にそれを打つように見える笑

答えを見つけました。

ISNULL()は、null値がある場合の処理​​を決定します。

この場合、関数はnull値を返すため、代わりに0を指定する必要がありました。

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

使用できます

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

私はそれがうまくいくと99%確信しています。

4
dkretz

Oracle/PLSQL:

NVL関数

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

SUM(Price)がnull値を返した場合、このSQLステートメントは_0_を返します。それ以外の場合、SUM(Price)値を返します。

1
tharindu_DG