字符串concat为sql中的标题forename surname组合使用isnull来检查值

时间:2014-12-12 23:27:59

标签: sql-server concatenation

我的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个空格,当没有给出标题时,在名称字符串的开头显示一个空格

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  +  

你明白了......可能是一种新的更好的方式