web-dev-qa-db-ja.com

SQLのCOALESCE関数

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

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

106
Lloyd Banks

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

詳細の詳細な説明はここにあります http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/

73
Bill Melius

私はあなたがその文書が曖昧だと思う理由がよくわからない。

単純にすべてのパラメータを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()はそうではありません。

209
MatBailie

COALESCEの見方は次のとおりです。

単純な形で…。

Coalesce(FieldName、 'Empty')

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

複数の値について...

Coalesce(FieldName1、FieldName2、Value2、Value3)

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

AdventureWorks2012サンプルデータベースのこのテストコードは完全に機能し、_合体_の視覚的な説明を提供します動作:

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

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

4
CindyPsych

次に、合体を含む簡単なクエリを示します-

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

AddressIdとcontactIdの両方がnullである人を返します。

合体関数

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

例えば.

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

Coalesce()関数 の最も簡単な定義は次のとおりです。

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

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

構文:

Coalesce(arg1, arg2, argN...)

注意:NULLと評価される引数は別として、他のすべての(NOT-NULL)引数は同じデータ型であるかmatching-types(互換性のあるデータ型に「暗黙的に自動変換」できる)、以下の例を参照:

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

1
Eddie Kumar
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
0
Xiao