我正在创建一个跨字段的计算列,其中一些字段可能为空。
问题是,如果这些字段中的任何一个为空,则整个计算列将为空。我从 Microsoft 文档中了解到这是预期的,可以通过设置 SET CONCAT_NULL_YIELDS_NULL 来关闭。但是,我不想更改此默认行为,因为我不知道它对 SQL Server 其他部分的影响。
有没有办法让我检查一列是否为空,如果它不为空,则只在计算列公式中附加其内容?
我正在创建一个跨字段的计算列,其中一些字段可能为空。
问题是,如果这些字段中的任何一个为空,则整个计算列将为空。我从 Microsoft 文档中了解到这是预期的,可以通过设置 SET CONCAT_NULL_YIELDS_NULL 来关闭。但是,我不想更改此默认行为,因为我不知道它对 SQL Server 其他部分的影响。
有没有办法让我检查一列是否为空,如果它不为空,则只在计算列公式中附加其内容?
您可以使用ISNULL(....)
SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')
如果列/表达式的值确实为 NULL,则将使用指定的第二个值(此处:空字符串)。
从 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, '')
我也遇到了很多麻烦。使用上面的案例示例无法使其正常工作,但这对我有用:
Replace(rtrim(ltrim(ISNULL(Flat_no, '') +
' ' + ISNULL(House_no, '') +
' ' + ISNULL(Street, '') +
' ' + ISNULL(Town, '') +
' ' + ISNULL(City, ''))),' ',' ')
替换更正了由连接单个空格而导致的双空格,它们之间没有任何内容。r/ltrim去掉末尾的任何空格。
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+"')
此示例将帮助您在创建插入语句时处理各种类型
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'