我的select语句中有以下代码行:
CONCAT(ISNULL([Customer].[Title]+' ',''),ISNULL([Customer].[Forename]+' ',''),ISNULL([Customer].[Surname],'')) AS [Customer Name],
当所有字段都完成时,这会按预期工作但有时情况并非如此,并且我的select语句中数据的对齐方式不是我预期的方式
Title Surname
Forename Surname
Forename Surname
Forename Surname
Forename Surname
Title Forename Surname
Forename Surname
Title Surname
Forename Surname
Forename Surname
Forename1 Forename2 Surname
如何正确连接字符串,以便仅在值不为null时才添加空格,因此如果没有标题,则第一个字符不会尾随空格等
注意当只给出一个标题和姓氏时,它们之间有2个空格,当没有给出标题时,在名称字符串的开头显示一个空格
答案 0 :(得分:2)
在我看来,你的很多空白实际上都是空字符串,而不是NULL。您可以尝试将列包装在NULLIF(Col,'')中,如下所示:
CONCAT(ISNULL(NULLIF([Customer].[Title],'')+' ',''),ISNULL(NULLIF([Customer].[Forename],'')+' ',''),ISNULL([Customer].[Surname],'')) AS [Customer Name],
没有必要在姓氏上做,因为你不是想在最后放置一个空格。
您是否需要了解其原因?
编辑:原因是因为当你向一个空字符串'添加'空格时,你得到一个空格。但是如果向NULL添加空格,则会得到NULL。 ISNULL正在抓住第二个案例,但不是第一个案例。强制将空字符串视为NULL将解析它。您可以使用LTRIM执行类似操作,从名称的每个部分中删除任何前导空格。
答案 1 :(得分:0)
case
when isnull(@field1,'') = ''then ''
else @field1 + ' '
end +
case
when @field2 is null then '' -- if you know fields will never be '' but not null
else @field2 + ' '
end +
你明白了......可能是一种新的更好的方式