TSQL-CONCAT_NULL_在不返回NULL时生成_NULL?
我环顾四周,似乎发现SQLServer2008R2存在一个奇怪的问题 我理解,使用CONCAT_NULL_产生_NULL=ON意味着以下内容将始终解析为NULLTSQL-CONCAT_NULL_在不返回NULL时生成_NULL?,tsql,sql-server-2008-r2,string-concatenation,Tsql,Sql Server 2008 R2,String Concatenation,我环顾四周,似乎发现SQLServer2008R2存在一个奇怪的问题 我理解,使用CONCAT_NULL_产生_NULL=ON意味着以下内容将始终解析为NULL SELECT NULL + 'My String' 我对此很满意,但是当将它与COALESCE()结合使用时,它似乎无法在我的数据库中工作 考虑以下查询,其中MyString是VARCHAR(2000) 现在在我的查询中,当MyString为NULL时,它返回一个空(非NULL)字符串。我可以在查询结果窗口中看到这一点 然而,非常罕见
SELECT NULL + 'My String'
我对此很满意,但是当将它与COALESCE()结合使用时,它似乎无法在我的数据库中工作
考虑以下查询,其中MyString是VARCHAR(2000)
现在在我的查询中,当MyString为NULL时,它返回一个空(非NULL)字符串。我可以在查询结果窗口中看到这一点
然而,非常罕见的是,当与INSERT一起运行时,它无法识别CONCAT_NULL,而是生成了_NULL,插入一个空白的“,”
insert的查询如下所示
CONCAT_NULL_YIELDS_NULL ON
INSERT INTO Mytable(StringValue)
SELECT COALESCE(MyString + ', ', '')
FROM MyTableOfValues
除此之外,我还检查了数据库,CONCAT_NULL_产生了_NULL=TRUE…Coalesce返回其参数中的第一个非NULL表达式 您将得到一个“,”,因为它是合并调用中的第一个非空表达式
从提供的一些答案中,我能够更深入地理解COALESCE() 上述查询无法完全工作的原因是,尽管我检查了null,但空字符串(“”)不被视为null。因此,尽管上述查询有效,但我应该先检查表中的空字符串 e、 g 会回来的
FullName
-----------
Joe, Bloggs
Jones
, Jones
Bob, Tielly
现在,第3行返回了一个“,”字符,这是我最初不希望看到的,因为它是一个空白但不是空值
下面的代码现在可以正常工作,因为它检查空白值。这是可行的,但看起来我走了很长的路。也许有更好的办法
-- 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]
使用NULLIF(MyString',)
而不仅仅是MyString
:
SELECT COALESCE(NULLIF(MyString, '') + ', ', '') FROM MyTableOfValues
从MyTableOfValues中选择合并(NULLIF(MyString),)+,,,“”)
似乎参数列表中的逗号太多,无法合并。请尝试使用COALESCE(MyString+',','')而不是COALESCE(MyString,+','','')。抱歉,Jakob,我在上面的示例中输入错误。这个问题的查询被重新格式化,因为我不打算发布所有的专栏细节。你可以考虑(MySc++',',' ''是我使用的。很抱歉我将编辑帖子。因为,我在字符串上使用contact,因为我想在末尾使用逗号和空格。使用CONCAT_NULL_生成_NULL,shouldnt MyString+,“返回NULL值,因此输出”。我当然在输出窗口(SSMS中的结果到网格)中看到了这一点,但它在插入时不起作用。-编辑,Caps。无法复制(通过在CONCAT…
前面添加SET
更正了您的示例查询)-如果我们使用您运行的实际查询来显示问题,会容易得多。我意识到尽管COALESCE()
正在检查空值。表中有空字符串,但由于格式原因,我没有看到这些字符串。因此,(我觉得有点愚蠢)它正在按预期工作。我需要从“MyTableOfValues”中选择任何空字符串。
-- 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]
SELECT COALESCE(NULLIF(MyString, '') + ', ', '') FROM MyTableOfValues