【问题标题】:Combine 3 Column when one of the value is empty( not null) remove extra space当其中一个值为空(非空)时合并3列删除多余的空间
【发布时间】:2017-04-05 17:16:07
【问题描述】:

数据

col1    col2    col3 
5121     w        river road 
5512     empty    pine road 

查询 1

Select LTRIM(ISNULL(Col1+' ','')+ ISNULL(col2+' ', '') + ISNULL(col3+' ','') as col4 from ...

查询 2

Select LTRIM(COALESCE(Col1+' ','')+ COALESCE(col2+' ', '') + COALESCE(col3+' ','') as col4 from ...

对于这两个结果我得到这个值

5121 w river road ( this looks good ) 
5512  pine road ( i get extra space for col 2 )

谢谢

【问题讨论】:

  • empty 意思是 null 或长度为 0 的字符串?
  • 好的,那么我有空值或空值而不是 0
  • Col1+" " 总是会在空字符串上返回一个空格,因此不为空
  • @ChrisCaviness NULL + ''NULL
  • 再一次,NULLS 或带有length = 0'' 的字符串以及你使用的是什么rdbms?

标签: sql trim coalesce


【解决方案1】:

问题是你有三种情况

  • 长度 = 0
  • 长度 > 0

DEMO

CREATE TABLE Table1
    ([col1] varchar(5), [col2] varchar(5), [col3] varchar(20))
;

INSERT INTO Table1
    ([col1], [col2], [col3])
VALUES
    ('5121', 'w', 'river road'),
    ('5512', null, 'pine road'),
    ('3333', '', 'death valley')
;

SELECT COALESCE(CASE WHEN col1 = '' THEN '' ELSE col1 + ' ' END, '')  + 
       COALESCE(CASE WHEN col2 = '' THEN '' ELSE col2 + ' ' END, '')  + 
       COALESCE(CASE WHEN col3 = '' THEN '' ELSE col3 + ' ' END, '')        

FROM Table1  

输出

原始的 OP 和 Jhon 版本在 NULLlength > 0 下工作正常,但在 length = 0 下失败

【讨论】:

  • 你需要一个 NULL 测试
  • @ChrisCaviness 在哪里?看起来像COALESCE 处理。或者在 DEMO 网站上给我看一个边界案例。
  • SELECT COALESCE(NULLIF(col1,''), Col1 + ' ') +
  • @ChrisCaviness 再次向我展示我的查询失败的情况。看起来您的解决方案也有效,但与我的不同。也许你可以发布一个不同的答案。
【解决方案2】:

考虑 Concat() 如果 2012+

正如您在 col2 中看到的那样...null+' ' 将导致 null,好消息是 concat() 将 null 表示为 ''

Declare @YourTable table (col1 varchar(50),col2 varchar(50),col3 varchar(50))
Insert Into @YourTable values
('5121','w', 'river road'),
('5512','','pine road'),  
('1313',null,'mocking bird lane')

Select concat(nullif(col1,'')+' ',nullif(col2,'')+' ',nullif(col3,''))
 From  @YourTable

退货

5121 w river road
5512 pine road           -- No Extra Space
1313 mocking bird lane   -- NULLs handled 

【讨论】:

  • 我无法更改作为客户数据的表格。我正在这样做。所有 3 列都设置为 varchar (255)
  • @john 表变量 (at)YourTable 只是说明性的。
  • 您的答案仅基于 Col1 或 Col2 接受空值的假设。 ''+' ' 不为空,因为它来自不受用户控制的数据库,或者甚至可能无法查看定义,所以你不能做出假设
  • @ChrisCaviness 另一种选择是如上图所示的简单替换
  • 不确定您的解决方案是否有效(至少在fiddle 中无效)。看起来你首先需要一个CONVERT,因为 col1 是整数。
猜你喜欢
  • 1970-01-01
  • 2014-10-31
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
相关资源
最近更新 更多