0

私は周りを見回しましたが、SQL Server2008R2で奇妙な問題に遭遇したようです。

CONCAT_NULL_YIELDS_NULL = ONの場合、以下が常にNULLに解決されることを意味することを理解しています

SELECT NULL + 'My String'

私はそれに満足していますが、これをCOALESCE()と組み合わせて使用​​すると、データベースで機能していないように見えます。

MyStringがVARCHAR(2000)である次のクエリについて考えてみます。

SELECT COALESCE(MyString + ', ', '') FROM MyTableOfValues

私のクエリでは、MyStringがNULLの場合、空の(NOT NULL)文字列を返します。これはクエリ結果ウィンドウで確認できます。

ただし、非常に珍しいことに、これをINSERTと組み合わせて実行すると、代わりにCONCAT_NULL_YIELDS_NULLを認識できず、空白の'、'が挿入されます。

挿入のクエリは次のとおりです。

CONCAT_NULL_YIELDS_NULL ON
INSERT INTO Mytable(StringValue)
SELECT COALESCE(MyString + ', ', '')
FROM MyTableOfValues

これに加えて、データベースとCONCAT_NULL_YIELDS_NULL=TRUEもチェックしました…</p>

4

3 に答える 3

2

NULLIF(MyString, '')代わりに使用するMyString

SELECT COALESCE(NULLIF(MyString, '') + ', ', '') FROM MyTableOfValues
于 2012-05-31T13:47:25.367 に答える
0

Coalesceは、引数の中で最初のnull以外の式を返します。

これは、合体呼び出しの最初のnull以外の式であるため、「、」を取得しています。

http://msdn.microsoft.com/en-us/library/ms190349.aspx

于 2012-05-29T13:27:29.573 に答える
0

提供された回答のいくつかから、COALESCE()のより深い理解を主張することができました。

上記のクエリが完全に機能しなかった理由は、nullをチェックしていたにもかかわらず、空の文字列('')がnullと見なされなかったためです。したがって、上記のクエリは機能しましたが、最初にテーブル内の空の文字列をチェックする必要がありました。

例えば

SELECT COALESCE(FirstName + ', ', '') + Surname
FROM 
(
    SELECT 'Joe' AS Firstname, 'Bloggs' AS Surname UNION ALL
    SELECT NULL, 'Jones'  UNION ALL
    SELECT '', 'Jones'  UNION ALL
    SELECT 'Bob', 'Tielly'
) AS [MyTable]

戻ります

FullName
-----------
Joe, Bloggs
Jones
, Jones
Bob, Tielly

これで、行3が「、」文字を返しました。これは、空白であるがNULL値ではないために当初は予期していなかった文字です。

次のコードは、空白の値をチェックするため、期待どおりに機能するようになりました。動作しますが、長い道のりを歩んだようです。より良い方法があるかもしれません。

-- Ammended Query
SELECT COALESCE(REPLACE(FirstName, Firstname , Firstname + ', '), '') + Surname AS FullName0
FROM 
(
    SELECT 'Joe' AS Firstname, 'Bloggs' AS Surname UNION ALL
    SELECT NULL, 'Jones'  UNION ALL
    SELECT '', 'Jones'  UNION ALL
    SELECT 'Bob', 'Tielly'
) AS [MyTable]
于 2012-05-31T10:03:48.420 に答える