【问题标题】:Concatenation with Null in SQL ServerSQL Server 中的 Null 连接
【发布时间】:2016-09-07 00:16:47
【问题描述】:

我在下面有一个简单的代码。

Select columnA, columnB, columnC
  From table.

这是我的结果。

A 列 B 列 C 列 苹果 G 空 果汁 S T9

现在,我使用如下串联

Select 
  ColumnA + '_'+ ColumnB + '_' + ISNULL(ColumnC, '') as Name
  From table

我的输出如下

姓名 苹果_G_ 果汁_S_T9

如何修改上面的串联,使其显示为 Apple_G 而不是 Apple_G_ 基本上,我的结果中有一个额外的 _。

【问题讨论】:

  • COALESCE()ISNULL() 函数或条件可能会有所帮助。当CONCAT_NULL_YIELDS_NULL 选项打开时,您必须手动处理NULL 值。始终建议这样做。

标签: sql tsql concatenation


【解决方案1】:

在应用IsNull 函数之前,只需将下划线与可空列连接即可。

Select 
  ColumnA + '_'+ ColumnB + ISNULL('_' + ColumnC, '') as Name
  From table

这需要将CONCAT_NULL_YIELDS_NULL 选项设置为ON。 - 默认情况下,这是 Microsoft 强烈推荐的。

【讨论】:

  • 我正要写同样的东西。
  • 无论ANSI_NULLS 设置为什么,它都能正常工作吗?我想我记得有一个设置x + null <> null...
  • @ThorstenDittmar:ANSI_NULLS = OFF 允许与 NULL 进行相等比较。例如。 WHERE Something = NULL。但是,我添加了关于 CONCAT_NULL_YIELDS_NULL 的信息,这可能是您所记得的。
【解决方案2】:

您可以使用 COALESCE,它会返回第一个非空表达式

Select COALESCE(ColumnA + '_'+ ColumnB + '_' + ColumnC, ColumnA + '_'+ ColumnB) as Name
  From table

或者如果你想更深层次地定制它

Select COALESCE(ColumnA + '_'+ ColumnB + '_' + ColumnC, 
                ColumnA + '_'+ ColumnB,
                ColumnA ) as Name
  From table

整个解决方案依赖于 SQL 服务器的特性,如果任何连接的字符串为空,则完整的字符串变为空。

【讨论】:

  • +先生Vergis,非常有用的技术。非常感谢
  • 总是x + null == null 吗?我想我记得有一个设置不是这种情况......
  • @ThorstenDittmar 是的,有一个设置可以更改此默认行为,但我从未遇到任何关闭此设置的数据库。
【解决方案3】:

使用IIF(SQL Server 2014+)或CASE

IIF

Select 
    ColumnA + '_' + 
    ColumnB + 
    IIF(ColumnC IS NOT NULL, '_' + ColumnC, '')
From table

CASE

Select 
    ColumnA + '_' + 
    ColumnB + 
    CASE 
        WHEN ColumnC IS NOT NULL THEN '_' + ColumnC
        ELSE ''
    END
From table

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2011-02-24
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多