如何组合多个列添加' - '并删除' - '与值{NULL}

时间:2017-03-29 21:19:07

标签: sql coalesce isnull

这是我的数据

col1    col2    col col3    col4    col5    col6 
42      A       11  18      89      16      empty
42      B       12  empty   89      14      C
36      8       9   empty   empty   2       empty 

这是我正在运行的脚本

select col1 + COALESCE ([col2]+'-','')
+COALESCE([col3]+'-','')+COALESCE([col4]+'-','')
+COALESCE([col5]+'-','')+COALESCE([col6],'') as totalCol 
FROM ...  

这就是我得到的

totalCol
42A-11-18-89-16-
42B-12- -89-14-C
368-9- - -2 -

这就是我想要的

totalCol
42A-11-18-89-16
42B-12-89-14-C
368-9-2

2 个答案:

答案 0 :(得分:1)

在脚本

之后运行“ - ”替换为“”

你还必须记住空值和空格是两回事。

更新了脚本

select ltrim(rtrim(replace(replace(
col1 + COALESCE ([col2]+'-','')
+COALESCE([col3]+'-','')+COALESCE([col4]+'-','')
+COALESCE([col5]+'-','')+COALESCE([col6],'') + ' ','--','-'),
'- ','')))
as totalCol 
FROM ...  

或假设只有空格而不是空格

select ltrim(rtrim(replace(
[col1] + [col2]+'-' + [col3]+'-' + [col4]+'-' + [col5]+'-' + [col6] + ' '
'- ','')))
as totalCol 
FROM ... 

答案 1 :(得分:0)

假设您已经设计了数据来说明问题(因为您的数据中有col,但在查询中没有使用col),您可以轻松地这样做。在所有非空数据之后添加破折号(-)。然后,我们拉除了最后一个字符(因为它总是短划线)。

我还添加了更多代码来创建数据,这样您就可以复制/运行整个查询并查看它是否有效。

declare @tbl table (
  col1 varchar(10) null,
  col2 varchar(10) null,
  col3 varchar(10) null,
  col4 varchar(10) null,
  col5 varchar(10) null,
  col6 varchar(10) null,
  col7 varchar(10) null
)

insert into @tbl values
('42', 'A', '11', '18', '89', '16', null),
('42', 'B', '12', null, '89', '14', 'C'),
('36', '8', '9', null, null, '2', null)

select left(x.concat_val, len(x.concat_val) - 1) as totalCol
from (
       select isnull(col1 + '-', '') +
              isnull(col2 + '-', '') +
              isnull(col3 + '-', '') +
              isnull(col4 + '-', '') +
              isnull(col5 + '-', '') +
              isnull(col6 + '-', '') +
              isnull(col7 + '-', '') as concat_val
       from @tbl
     ) as x

这里是返回的数据:

totalCol
-----------------------------------------------------------------------------
42-A-11-18-89-16
42-B-12-89-14-C
36-8-9-2