SQLサーバークエリでNULLを0に置き換える


175

クエリを作成しましたが、最初の3列の結果にはが表示されますNULL。どうすれば置き換えることができ0ますか?

  Select c.rundate, 
    sum(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded, 
    sum(case when c.runstatus = 'Failed' then 1 end) as Failed, 
    sum(case when c.runstatus = 'Cancelled' then 1 end) as Cancelled, 
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock) 
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by 
    c.rundate

@ user2246674最初の3列:sum(case when c.runstatus = 'Succeeded' then 1 end)as Succeeded、sum(case when c.runstatus = 'Failed' then one end)as Failed、sum(case when c.runstatus = 'Cancelled' then 1 end)as Canceled
Bhaskar Mishra

Sparky、OracleはNVLまたはNVL2を使用するためにisnullではありません... oracle-base.com/articles/misc/null-related-functionsを
KingRider

回答:


376

可能性のあるnull列を別のものに置き換える場合は、IsNullを使用します

SELECT ISNULL(myColumn, 0 ) FROM myTable

そもそもnullの場合、myColumnに0が入ります。


2
SQL Server 2000または2005を使用している少数の人にとって、ISNULLはSQL Server 2008以降です。
カイル

1
複数の列の場合、ISNULLを複数回記述する必要がありますか、それともISNULL(myColumns、0)のようなものがありますか?
Flaudre 2017

@カイル:それは間違っています:個人的な経験(および本の引用)から、ISNULLは(少なくとも)SQL Server 2000以降、おそらくそれ以前にもサポートされていることが確認できます。
ハインツィ

@Flaudre:すべての出力列には独自の式が必要なので、ISNULLを複数回記述する必要があります。
ハインツィ

これは、SQL Server 2016で正確な結果を得るのにも役立ちます。おかげで、あなたは私の一日を@phadaphunkにしただけです
PatsonLeaner

83

これらの方法はどちらも使用できますが、違いがあります。

SELECT ISNULL(col1, 0 ) FROM table1
SELECT COALESCE(col1, 0 ) FROM table1

COALESCE()とISNULL()の比較:

  1. ISNULL関数とCOALESCE式の目的は似ていますが、動作が異なる場合があります。

  2. ISNULLは関数であるため、1回だけ評価されます。上記のように、COALESCE式の入力値は複数回評価できます。

  3. 結果の式のデータ型決定は異なります。ISNULLは最初のパラメーターのデータ型を使用し、COALESCEはCASE式の規則に従い、最高の優先順位を持つ値のデータ型を返します。

  4. 結果式のNULL可能性は、ISNULLとCOALESCEでは異なります。ISNULL戻り値は常にNOT NULL可能と見なされます(戻り値がnull可能ではないと想定)が、NULL以外のパラメーターを持つCOALESCEはNULLと見なされます。したがって、式ISNULL(NULL、1)とCOALESCE(NULL、1)は、同等のnullability値を持っています。これは、計算列でこれらの式を使用する場合、キー制約を作成する場合、またはスカラーUDFの戻り値を確定的にする場合に違いがあり、次の例に示すようにインデックスを付けることができます。

-PRIMARY KEYがNULL値を受け入れることができないため、このステートメントは失敗します-col2のCOALESCE式のNULL可能性-はNULLと評価されます。

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0) PRIMARY KEY, 
    col3 AS ISNULL(col1, 0) 
); 

-このステートメントが成功するのは、-のNULL可能性です-ISNULL関数はAS NOT NULLを評価します。

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. ISNULLとCOALESCEの検証も異なります。たとえば、ISNULLのNULL値はintに変換されますが、COALESCEの場合、データ型を指定する必要があります。

  2. ISNULLは2つのパラメーターのみを受け取りますが、COALESCEは可変数のパラメーターを受け取ります。

    詳細については、ここに msdnからの完全なドキュメントを参照してください。


23

coalesce

coalesce(column_name,0)

合計する場合は、けれどもwhen condition then 1、あなたは同じように簡単に変更することができますsumcount-例えば:

count(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,

Count(null)は0をsum(null)返し、null を返します。)


10

最初の3つの列を言うとき、あなたのSUM列を意味しますか?その場合はELSE 0CASEステートメントに追加してください。値です。SUMNULLNULL

sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 


7

このコードで列を囲みます。

 ISNULL(Yourcolumn, 0)

たぶんnullを取得している理由を確認してください


6

COALESCE最初のnull以外の値を返すを使用します。例:

SELECT COALESCE(sum(case when c.runstatus = 'Succeeded' then 1 end), 0) as Succeeded

として返された場合、Succeededを0に設定しNULLます。


1

elseをcaseステートメントに追加して、テスト条件が見つからない場合にデフォルトでゼロになるようにします。現時点では、テスト条件が見つからない場合、SUM()関数にNULLが渡されています。

  Select c.rundate, 
    sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
    sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
    sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock) 
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by 
    c.rundate

1

Presto、AWS Athenaなどを使用している場合、ISNULL()関数はありません。代わりに、次を使用します。

SELECT COALESCE(myColumn, 0 ) FROM myTable

0
sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 

ここでの問題は、elseステートメントがないと、実行ステータスが列の説明に示されているステータスではない場合に、Nullを受け取ることになります。Nullに何かを追加するとNullが発生し、それがこのクエリの問題です。

幸運を!


0

以前の回答に従うと、SQLサーバーデータベースで列名が失われましたが、この構文に従うと、ColumnNameも保持できました。

ISNULL(MyColumnName, 0) MyColumnName
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.