我正在创建一个由多个字段计算的列,其中一些字段可能为空。
问题在于,如果其中任何一个字段为空,则整个计算列都将为空。根据Microsoft的文档,我了解到这是预期的,并且可以通过设置SET CONCAT_NULL_YIELDS_NULL来关闭此功能。但是,我不想更改此默认行为,因为我不知道它对SQL Server的其他部分的影响。
有没有办法只检查一个列是否为空,如果非空则在计算列公式中只追加其内容呢?
我正在创建一个由多个字段计算的列,其中一些字段可能为空。
问题在于,如果其中任何一个字段为空,则整个计算列都将为空。根据Microsoft的文档,我了解到这是预期的,并且可以通过设置SET CONCAT_NULL_YIELDS_NULL来关闭此功能。但是,我不想更改此默认行为,因为我不知道它对SQL Server的其他部分的影响。
有没有办法只检查一个列是否为空,如果非空则在计算列公式中只追加其内容呢?
ISNULL(....)
。SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')
如果列/表达式的值确实为NULL,则将使用指定的第二个值(这里为空字符串)。ISNULL()
是一个不错的解决方案,但从 SQL Server 2012 开始,您也可以使用 CONCAT
函数来获得相同的结果:CONCAT(@Column1, @Column2)
。 - Muhammad Musavinull
替换为除空字符串之外的其他内容,例如IsNull(@Column1, 'NULLVALUE')
,则使用IsNull
函数时,替换字符串的长度受其替换的列的长度限制,而使用Coalesce
函数则没有此限制。 - Jamie从 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*/
使用COALESCE函数。将your_column
替换为COALESCE(your_column, '')
。这样会返回空字符串而不是NULL。
+
)的结果一起使用 - 就像接受的答案使用ISNULL
一样。 - Martin Smith您也可以使用 CASE - 我下面的代码检查 null 值和空字符串,并只有在后跟值时才添加分隔符:
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
如果有人需要帮助添加字符串之间的分隔符,取决于字段是否为 NULL ,我只是想做出贡献。
所以在创建一个单行地址的例子中
Address1,Address2,Address3,City,PostCode
在我的情况下,我有以下计算列似乎可以按照我想要的方式工作:
case
when [Address1] IS NOT NULL
then ((( [Address1] +
isnull(', '+[Address2],'')) +
isnull(', '+[Address3],'')) +
isnull(', '+[City] ,'')) +
isnull(', '+[PostCode],'')
end
希望这能帮助到某些人!
ISNULL(ColumnName, '')
我也遇到了很多问题。无法使用上面的示例解决问题,但是以下内容对我有用:
Replace(rtrim(ltrim(ISNULL(Flat_no, '') +
' ' + ISNULL(House_no, '') +
' ' + ISNULL(Street, '') +
' ' + ISNULL(Town, '') +
' ' + ISNULL(City, ''))),' ',' ')
Replace函数可以将由单个空格相连而没有任何间隔的双空格纠正为单个空格。 r/ltrim 函数可去除两端的任何空格。
在 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.
代码后端:
string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'";
string email = txtEmail.Text;
insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"')
这个例子将帮助您在创建插入语句时处理各种类型
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'