【问题标题】:SQL Server : concatenate values and ignore null or blank valuesSQL Server:连接值并忽略空值或空白值
【发布时间】:2017-01-21 15:09:23
【问题描述】:

我使用的是 SQL Server 2014,并且我有一个包含地址列表的表,其中的项目位于单独的列中。

例如:

st number Prefix  st name    suffix   Dir    unit    number    city    zip
___________________________________________________________________________
1234       W       Main       St      NULL   Unit     34        LA     90210
345       NULL     George     Ave     NULL   NULL     NULL      SF     94525
123        E       Bloom      Ct       W     NULL     NULL      DC     99342

我想连接这些地址并将它们组合成一个单元格。

主要目标是使用该连接地址链接到另一个表。例如,如果我使用ISNULL 连接以忽略空白值,它会给我这个

345 _ George Ave _ _ _ SF 94525. 

(我添加了_ 以显示使用空间的位置)

当有空值时,它会添加一个空格。如果有空格,则指向另一个表的链接将不起作用。我试过COALESCE,但没用。我对 Coalesce 不太熟悉,但我认为 COALESCE 只会给我第一个非空值。我想要的结果是:

1234 W Main St Unit 34 LA 90210
345 George Ave SF 94525
123 E bloom Ct W DC 99342

我如何将这些项目组合在一起,而空值之间没有空格?请帮忙。谢谢

【问题讨论】:

  • 贴出你已经试过的代码
  • If there is a space the link to the other table will not work. ... 即使没有多余的空格,如何计划加入缺少信息的部分地址?

标签: sql sql-server tsql null concatenation


【解决方案1】:

基于 Prdp 的回答,一个简单的替换(或两个)可以消除双/三空格。

Declare @YourTable table ([st number] varchar(25),Prefix varchar(25),[st name] varchar(25),suffix varchar(25),Dir varchar(25),unit varchar(25),number varchar(25),city varchar(25),zip varchar(25))
Insert Into @YourTable values
('1234','W' ,'Main'  ,'St' ,NULL,'Unit','34','LA','90210'),
('345' ,NULL,'George','Ave',NULL,NULL  ,NULL,'SF','94525'),
('123' ,'E' ,'Bloom' ,'Ct' ,'W' ,NULL  ,NULL,'DC','99342')

Select FullAddress = replace(replace(concat([st number],' ',Prefix,' ',[st name],' ',suffix,' ',Dir,' ',unit,' ',number,' ',city,' ',zip),'   ',' '),'  ',' ')
 From  @YourTable A

返回

FullAddress
1234 W Main St Unit 34 LA 90210
345 George Ave SF 94525
123 E Bloom Ct W DC 99342

【讨论】:

  • 看了你的回答后,我明白了 Gordan 对我的回答所说的话
  • @Prdp 我倾向于 concat 方法。我不知道它是否更快,但在我的小脑袋里,它看起来更干净。
  • 最重要的是它做了我喜欢的隐式转换。我错过了替换部分:/。据我使用,CONCAT 函数没有性能问题,如FORMAT ;)
  • 这可能发生在数据上,但是当您有任意数量的相邻NULL 列时,就很难制定。
  • @GordonLinoff 如果我理解您的评论。这需要 6 个连续的空值才能成为问题。
【解决方案2】:

你可以这样做:

select (coalesce(st_number + ' ', '') +
        coalesce(prefix + ' ', '') +
        coalesce(st_name + ' ', '') +
        . . .
       )

这会在字符串的末尾留下一个剩余空间。您可以使用rtrim() 将其删除。

select rtrim(coalesce(st_number + ' ', '') +
             coalesce(prefix + ' ', '') +
             coalesce(st_name + ' ', '') +
             . . .
            )

正如 Prdp 指出的那样,这假定列实际上是字符串。否则,这些列将需要显式转换(或者您可以使用concat() 函数而不是+)。

【讨论】:

  • 如果列本身是 NULL,您应该评论一下,例如,st_number + ' ' 是 NULL。
  • 这也认为列可以隐式转换为具有最高优先级的数据类型。当数据类型为numeric 时,Coalesce 中的空字符串和空格将转换为0
猜你喜欢
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多