SQL Server字符串连接与Null

Ale*_*lex 81 sql-server null string-concatenation calculated-columns

我正在创建一个跨越字段的计算列,其中一些可能为null.

问题是如果这些字段中的任何一个为null,则整个计算列将为null.我从Microsoft文档中了解到这是预期的,可以通过SET CONCAT_NULL_YIELDS_NULL设置关闭.但是,我不想更改此默认行为,因为我不知道它对SQL Server其他部分的影响.

有没有办法让我只检查一列是否为空,如果它不为空,只在计算列公式中附加其内容?

mar*_*c_s 135

您可以使用 ISNULL(....)

SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')
Run Code Online (Sandbox Code Playgroud)

如果列/表达式的值确实为NULL,则将使用指定的第二个值(此处为:空字符串).

  • "Coalesce"是ANSI标准函数名称,但ISNULL更容易拼写. (21认同)
  • 这里值得注意的是,如果您想将 `null` 替换为空字符串以外的其他内容,即 `IsNull(@Column1, 'NULLVALUE')`,则使用 `IsNull` 替换字符串长度仅限于列的长度它正在替换,但不是“Coalesce” (2认同)

Mar*_*ith 51

从SQL Server 2012开始,使用该CONCAT功能可以轻松实现.

它被视为NULL空字符串

DECLARE @Column1 VARCHAR(50) = 'Foo',
        @Column2 VARCHAR(50) = NULL,
        @Column3 VARCHAR(50) = 'Bar';


SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/
Run Code Online (Sandbox Code Playgroud)

  • @Savage-COALESCE无法工作,因为它没有连接,它只返回第一个非null参数 (2认同)

Mar*_*ers 30

使用COALESCE.而不是your_column使用COALESCE(your_column, '').这将返回空字符串而不是NULL.


小智 11

你也可以使用CASE - 我的代码检查空值和空字符串,并且只有在有值时才添加一个分隔符:

SELECT OrganisationName, 
'Address' = 
CASE WHEN Addr1 IS NULL OR Addr1 = '' THEN '' ELSE Addr1 END + 
CASE WHEN Addr2 IS NULL OR Addr2 = '' THEN '' ELSE ', ' + Addr2 END + 
CASE WHEN Addr3 IS NULL OR Addr3 = '' THEN '' ELSE ', ' + Addr3 END + 
CASE WHEN County IS NULL OR County = '' THEN '' ELSE ', ' + County END 
FROM Organisations 
Run Code Online (Sandbox Code Playgroud)


Sim*_*ran 10

使用

SET CONCAT_NULL_YIELDS_NULL  OFF 
Run Code Online (Sandbox Code Playgroud)

并且将null值连接到字符串不会导致null.

请注意,这是一个弃用的选项,请避免使用.有关详细信息,请参阅文档.


ebo*_*ens 8

我只想在有人寻求帮助时在字符串之间添加分隔符,这取决于字段是否为NULL.

因此,在从单独的字段创建单行地址的示例中

地址1,地址2,地址3,城市,邮编

在我的情况下,我有以下计算列似乎按我的意愿工作:

case 
    when [Address1] IS NOT NULL 
    then (((          [Address1]      + 
          isnull(', '+[Address2],'')) +
          isnull(', '+[Address3],'')) +
          isnull(', '+[City]    ,'')) +
          isnull(', '+[PostCode],'')  
end
Run Code Online (Sandbox Code Playgroud)

希望有人帮助!


Ian*_*obs 7

ISNULL(ColumnName, '')