TSQL - CONCAT_NULL_YIELDS_NULL ON没有返回空?

时间:2012-05-29 13:18:19

标签: tsql sql-server-2008-r2 string-concatenation

我浏览了一下,似乎遇到了SQL Server 2008 R2的一个奇怪问题。

据我所知,使用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 ......

3 个答案:

答案 0 :(得分:2)

使用NULLIF(MyString, '')代替MyString

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

答案 1 :(得分:0)

Coalesce在其参数中返回第一个非空表达式。

你得到一个','因为它是你的合并调用中的第一个非空表达式。

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

答案 2 :(得分:0)

通过提供的一些答案,我能够更深入地了解COALESCE()。

上述查询没有完全起作用的原因是因为虽然我正在检查空值,但空字符串('')不被视为null。因此,虽然上面的查询有效,但我应该先在表格中检查空字符串。

e.g。

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]