如何组合多列添加'-'并删除'-'值为NULL

How to combine mulitple column adding '-' and removing '-' with value is NULL

这是我的数据

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

运行 在您的脚本后将“-”替换为“”

您还必须记住,空值和空白 space 是两种不同的东西。

更新脚本

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

或假设只有空白 space 而不是空值

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

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

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

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