0

我环顾四周,似乎遇到了 SQL Server 2008 R2 的一个奇怪问题。

我知道使用 CONCAT_NULL_YIELDS_NULL = ON 意味着以下内容将始终解析为 NULL

SELECT NULL + 'My String'

我对此很满意,但是当将它与 COALESCE() 结合使用时,它似乎不适用于我的数据库。

考虑以下查询,其中 MyString 是 VARCHAR(2000)

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

现在在我的查询中,当 MyString IS 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 返回其参数中的第一个非空表达式。

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

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

于 2012-05-29T13:27:29.573 回答
0

从提供的一些答案中,我能够断言对 COALESCE() 有更深入的理解。

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

例如

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 回答