90

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

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

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

4

10 回答 10

152

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

SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')

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

于 2010-05-26T21:07:00.193 回答
67

从 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*/
于 2013-11-08T14:40:58.033 回答
32

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

于 2010-05-26T21:06:08.993 回答
14

您还可以使用 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 
于 2013-11-17T13:48:15.983 回答
11

利用

SET CONCAT_NULL_YIELDS_NULL  OFF 

并且将空值连接到字符串不会导致空值。

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

于 2015-02-07T10:20:22.117 回答
10

如果有人正在寻求在字符串之间添加分隔符的帮助,我只是想贡献一下,这取决于字段是否为NULL

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

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

就我而言,我有以下计算列,它似乎可以按我的意愿工作:

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

希望对某人有所帮助!

于 2013-11-08T14:24:02.163 回答
7

ISNULL(ColumnName, '')

于 2010-05-26T21:06:50.017 回答
2

我也遇到了很多麻烦。使用上面的案例示例无法使其正常工作,但这对我有用:

Replace(rtrim(ltrim(ISNULL(Flat_no, '') + 
' ' + ISNULL(House_no, '') + 
' ' + ISNULL(Street, '') + 
' ' + ISNULL(Town, '') + 
' ' + ISNULL(City, ''))),'  ',' ')

替换更正了由连接单个空格而导致的双空格,它们之间没有任何内容。r/ltrim去掉末尾的任何空格。

于 2016-05-27T13:28:47.073 回答
0

In Sql Server:

insert into Table_Name(PersonName,PersonEmail) values(NULL,'xyz@xyz.com')

PersonName is varchar(50), NULL is not a string, because we are not passing with in single codes, so it treat as NULL.

Code Behind:

string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'";
string email = txtEmail.Text;

insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"')
于 2012-12-26T10:59:57.737 回答
-1

此示例将帮助您在创建插入语句时处理各种类型

select 
'insert into doc(Id, CDate, Str, Code, Price, Tag )' + 
'values(' +
      '''' + convert(nvarchar(50), Id) + ''',' -- uniqueidentifier
    + '''' + LEFT(CONVERT(VARCHAR, CDate, 120), 10) + ''',' -- date
    + '''' + Str+ ''',' -- string
    + '''' + convert(nvarchar(50), Code)  + ''',' -- int
    + convert(nvarchar(50), Price) + ',' -- decimal
    + '''' + ISNULL(Tag, '''''') + '''' + ')'  -- nullable string

 from doc
 where CDate> '2019-01-01 00:00:00.000'
于 2019-02-18T14:49:04.217 回答