TSQLのCOALESCE関数


109

TSQLのCOALESCE関数がどのように機能するかを誰かが説明できますか?構文は次のとおりです

COALESCE(x、y)

この関数に関するMSDNドキュメントはかなりあいまいです

回答:


74

COALESCEはISNULLよりもコストが安いと言われていますが、調査ではそれが示されていません。ISNULLは2つのパラメーターのみを受け取ります。NULLとして評価されるフィールドと、NULLとして評価される場合に必要な結果です。COALESCEは任意の数のパラメーターを取り、NULLでない最初の値を返します。

詳細については、http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/を参照して ください。


6
ISNULL標準ではなく柔軟性が低いを使用することに注意してください。最初の引数のデータ型は常に返され、返される値のデータ型は返されCOALESCEません。
sprocket12

215

ドキュメントが曖昧だと思う理由がわかりません。

すべてのパラメーターを1つずつ確認し、最初のを返しますNOT NULL

COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1


COALESCE(1, 2, 3, 4, 5, NULL)
=> 1


COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3


COALESCE(6, 5, 4, 3, 2, NULL)
=> 6


COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL

ほぼすべてのパラメーターを受け入れますが、それらは同じデータ型でなければなりません。 (それらが同じデータ型でない場合は、データ型の優先順位を使用して、適切なデータ型に暗黙的にキャストされます。)

ISNULL()2つのパラメーターではなく、複数のパラメーターのようなものです。

またANSI-SQL、そうでISNULL()はありません。


4
+1データ型の優先順位についての説明。ISNULLただし、最初のパラメーターと同じデータ型の値が返されると思います
Lamak

5
あなたの最後のコード例では、ソース「COALESCEへの引数の少なくとも一方は、型指定されたNULLでなければなりません」というエラーを与える必要があります:sql-server-performance.com/2007/...
maqk

2
ドキュメントは多くのことを述べているが、ほとんどゼロの値を提供することもできている。優れたドキュメントは、単純な例で単純な結果を提供します。Coalesceはすぐにexpressions、CASEとの比較、ISNULLとの比較、そして最後に結果のない例に移動します。次に、詳細が多すぎる過度に複雑な例を示します。5〜6行のWTFでこの答えが必要な場合、これは実際に行われます。
P.Brian.Mackey 2017年


18

これがCOALESCEの見方です...そしてうまくいけばそれは理にかなっています...

単純化した形で…。

Coalesce(フィールド名、 '空')

したがって、これは次のように変換されます。「FieldName」がNULLの場合、フィールド値に「EMPTY」という単語を入力します。

次に、複数の値について...

Coalesce(フィールド名1、フィールド名2、値2、値3)

Fieldname1の値がnullの場合は、Fieldname2の値を入力します。FieldName2がNULLの場合は、Value2を入力します。

このAdventureWorks2012サンプルデータベースのテストコードは完全に機能し、COALESCEの機能を視覚的に詳しく説明しています。

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product

4

単にISNULLを置き換えるだけでなく、結合する必要があることはたくさんあります。合体の公式の「文書化」が曖昧で役に立たないことに完全に同意します。この記事は大いに役立ちます。 http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/


3
リンクした記事は非常に誤解を招くものです(コメントセクションで著者を含む複数の人が指摘しているように)。彼が強調するすべての巧妙なトリックは、合体の代わりにISNULLを使用してすべて実行できます。
Hobo Spider

3

これは、合体を含む簡単なクエリです-

select * from person where coalesce(addressId, ContactId) is null.

これは、addressIdとcontactIdの両方がnullである個人を返します。

合体機能

  • 少なくとも2つの引数を取ります。
  • 引数は整数型でなければなりません。
  • 最初のnull以外の引数を返します。

例えば

  • coalesce(null、1、2、3)は1を返します。
  • coalesce(null、null)はnullを返します。

1

Coalesce()関数の最も単純な定義は次のようになります。

Coalesce()関数は渡されたすべての引数を評価してから、NULLに評価されなかった引数の最初のインスタンスの値を返します。

注:すべてのパラメーターを評価します。つまり、返された/ NOT NULLパラメーターの右側の引数の評価をスキップしません。

構文:

Coalesce(arg1, arg2, argN...)

注意:NULLに評価される引数を除いて、他のすべての(NOT-NULL)引数は同じデータ型であるか、一致する型(互換性のあるデータ型に「暗黙的に自動変換」できる)でなければなりません。例を参照してください未満:

PRINT COALESCE(NULL, ('str-'+'1'), 'x')  --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3)    --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99)      --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.

DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31')  --returns today's date, works fine as implicit conversion into DATE type occurs.

--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str')      --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.

--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt)      --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.

HTH


0
declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str

1
私はこれがはるかに簡単だとわかりました。
Xiao
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.