誰かがSQLのCOALESCE関数がどのように機能するのか説明できますか?構文は次のとおりです。
この機能に関するMSDNドキュメントはかなりあいまいです
COALESCEはISNULLよりもコストが低いと言われましたが、調査ではそれが示されていません。 ISNULLは、NULLとして評価されるフィールドと、NULLとして評価される場合に必要な結果の2つのパラメーターのみを取ります。 COALESCEは任意の数のパラメーターを取り、NULL以外の最初に検出された値を返します。
詳細の詳細な説明はここにあります http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
私はあなたがその文書が曖昧だと思う理由がよくわからない。
単純にすべてのパラメータを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()
はそうではありません。
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
ISNULLを単に置き換えるだけでなく、合体することも多くあります。合体の公式の「文書」があいまいで役に立たないことに完全に同意します。この記事は非常に役立ちます。 http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
次に、合体を含む簡単なクエリを示します-
select * from person where coalesce(addressId, ContactId) is null.
AddressIdとcontactIdの両方がnullである人を返します。
合体関数
例えば.
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
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