我浏览了一下,似乎遇到了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 ......
答案 0 :(得分:2)
使用NULLIF(MyString, '')
代替MyString
:
SELECT COALESCE(NULLIF(MyString, '') + ', ', '') FROM MyTableOfValues
答案 1 :(得分:0)
Coalesce在其参数中返回第一个非空表达式。
你得到一个','因为它是你的合并调用中的第一个非空表达式。
答案 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]