【问题标题】:TSQL - CONCAT_NULL_YIELDS_NULL ON Not Returning Null?TSQL - CONCAT_NULL_YIELDS_NULL ON 不返回空值?
【发布时间】:2012-06-03 17:27:08
【问题描述】:

我环顾四周,似乎遇到了 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 时,它返回一个空(非 NULL)字符串。我可以在查询结果窗口中看到这一点。

然而非常不寻常的是,当它与 INSERT 一起运行时,它无法识别 CONCAT_NULL_YIELDS_NULL,而是插入了一个空白“,”。

insert的查询如下。

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

除此之外,我还检查了数据库和 CONCAT_NULL_YIELDS_NULL = TRUE……

【问题讨论】:

  • 您的 COALESCE 参数列表中的逗号似乎太多了。尝试 COALESCE(MyString + ', ', '') 而不是 COALESCE(MyString, + ', ', '')。
  • 抱歉 Jakob,我在上面的例子中打错了。查询已针对此问题重新格式化,因为我不打算发布所有列详细信息。您可以将 (MyString + ', ', '') 视为我使用的。抱歉...我会编辑帖子。
  • 因为我在字符串上使用了联系人,因为我想在末尾使用逗号和空格。使用 CONCAT_NULL_YIELDS_NULL,MyString + ', ' 不应该返回 Null 值,因此输出 ''。我当然在输出窗口中看到了这一点(SSMS 中的网格结果),但它在插入时不起作用。 - 编辑,大写。
  • 无法重现(通过在CONCAT_... 前面添加SET 更正了您的示例查询) - 如果我们使用您 已运行显示问题。
  • 我意识到虽然COALESCE() 正在检查空值,但该表有空字符串,由于它的格式化方式我没有看到。因此,(我觉得有点愚蠢)它按预期工作。我需要从“MyTableOfValues”中选择退出任何空字符串。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    从提供的一些答案中,我能够断言对 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]
    

    【讨论】:

      【解决方案3】:

      使用NULLIF(MyString, '') 而不仅仅是MyString

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-13
        • 2018-06-09
        • 1970-01-01
        • 2019-02-11
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        相关资源
        最近更新 更多