【问题标题】:How to combine mulitple column adding '-' and removing '-' with value is NULL如何组合多列添加'-'和删除'-'值为NULL
【发布时间】:2017-08-23 13:55:57
【问题描述】:

这是我的数据

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

【问题讨论】:

  • 当您在示例数据中写“空”时,您的意思是 NULL 还是“空”字符串''
  • 那么,您不想在col1col2 之间使用破折号吗?并且您的数据有一个 col 未在您的查询中使用。因此,您的查询无法创建 this is what I get 数据...请澄清。
  • 是的,第 1 列和第 2 列没有破折号,基本上我将 6 列组合成一列,并且在第一列和第二列旁边有破折号。如果任何一列有空值,我不希望破折号像上面的例子那样显示

标签: sql coalesce isnull


【解决方案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 ... 

【讨论】:

  • 太棒了,这适用于第二行,但第一行和第三行我仍然得到额外的 - 最后。但不再是中间了。
  • 回复上一封电子邮件。数据是空字符串而不是 NULL
  • 第一个脚本的末尾有一个-,如“42A-11-18-89-16-”,第二个脚本通过错误“'-'附近的语法不正确。”
  • 你能试试第一个脚本吗@john... 对于第二个脚本,你能不能把你的陈述弹给我,让我检查一下。欢呼
  • 太棒了,第一个脚本成功了。这就是我所需要的。非常感谢。 感谢大家的帮助。
【解决方案2】:

假设您已经设计了数据来说明问题(因为您的数据中有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

【讨论】:

  • 这是别人的数据我不想改变数据类型。我想在视图中执行此操作。 col 名称只是一个例子。不是真正的列名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2021-09-07
  • 2019-07-11
  • 1970-01-01
  • 2021-01-28
  • 2019-04-09
相关资源
最近更新 更多