我正在跨字段创建计算列,其中某些字段可能为空。
问题是,如果这些字段中的任何一个为空,则整个计算列将为空。我从Microsoft文档中了解到这是可以预期的,可以通过设置SET CONCAT_NULL_YIELDS_NULL将其关闭。但是,我不想更改此默认行为,因为我不知道它对SQL Server其他部分的影响。
有没有一种方法可以让我检查列是否为空,如果列不为空,则仅将其内容追加到计算列公式中?
我正在跨字段创建计算列,其中某些字段可能为空。
问题是,如果这些字段中的任何一个为空,则整个计算列将为空。我从Microsoft文档中了解到这是可以预期的,可以通过设置SET CONCAT_NULL_YIELDS_NULL将其关闭。但是,我不想更改此默认行为,因为我不知道它对SQL Server其他部分的影响。
有没有一种方法可以让我检查列是否为空,如果列不为空,则仅将其内容追加到计算列公式中?
Answers:
您可以使用 ISNULL(....)
SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')
如果column / expression的值确实为NULL,则将使用指定的第二个值(此处为空字符串)代替。
ISNULL()
是一个很好的解决方案,但是从SQL Server 2012起,您还可以使用CONCAT
函数来获得相同的结果:CONCAT(@Column1, @Column2)
null
比一个空字符串以外的东西,即IsNull(@Column1, 'NULLVALUE')
,与IsNull
替换字符串的长度被限制在它的更换色谱柱的长度,而这是不Coalesce
在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。
您还可以使用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
如果有人在寻求有关在字符串之间添加分隔符的帮助,这取决于字段是否为NULL,我只是想做出贡献。
因此,在从单独的字段创建一个行地址的示例中
地址1,地址2,地址3,城市,邮编
就我而言,我有以下计算列似乎可以按我的意愿工作:
case
when [Address1] IS NOT NULL
then ((( [Address1] +
isnull(', '+[Address2],'')) +
isnull(', '+[Address3],'')) +
isnull(', '+[City] ,'')) +
isnull(', '+[PostCode],'')
end
希望能对某人有所帮助!
ISNULL(ColumnName, '')
在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'