【问题标题】:Concatenate or merge many columns values with a separator between and ignoring nulls - SQL Server 2016 or older使用分隔符连接或合并许多列值并忽略空值 - SQL Server 2016 或更早版本
【发布时间】:2021-01-27 17:14:51
【问题描述】:

我想用 SQL Server 2016 或更早版本模拟 CONCAT_WS SQL Server 2017+ 函数,以便连接许多列,这些列的值是这样的字符串:

输入:

| COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 |
   'A'        'B'       NULL     'D'
   NULL       'E'       'F'      'G'
   NULL       NULL      NULL     NULL

输出:

| MERGE |
 'A|B|D'
 'E|F|G'
  NULL

请注意,输出结果是一个新列,它连接了由“|”分隔的所有值。如果列中没有值,则默认值应为 NULL。

我尝试使用 CONCAT 和具有许多 WHEN 条件的 CASE 语句,但确实很脏,我不允许使用此解决方案。提前致谢。

【问题讨论】:

  • 您必须复制 CONCAT_WS 引入的条件逻辑,这将需要混乱的代码。凌乱的代码不必在您的查询中;例如,您可以将其隐藏在内联 TVF 中。但我想这也取决于谁说你“不允许”做事。

标签: sql sql-server sql-server-2016


【解决方案1】:

一种方便的方法是:

select stuff( coalesce(',' + column1, '') +
              coalesce(',' + column2, '') +
              coalesce(',' + column3, '') +
              coalesce(',' + column4, ''), 1, 1, ''
            )

         

【讨论】:

  • 我认为你也需要一个NULLIF(),因为如果它们都是NULL,你最终会得到一个空字符串。
  • 非常感谢。您的答案给出了预期的结果,但带有“|”而不是 ','。
【解决方案2】:

这是另一种使用 XML 和 XQuery 的方法。

列数不是硬编码的,它可以是动态的。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, col1 CHAR(1), col2 CHAR(1), col3 CHAR(1), col4 CHAR(1));
INSERT INTO @tbl (col1, col2, col3, col4) VALUES
( 'A',  'B',  NULL, 'D'),
(NULL, 'E' , 'F'  , 'G'),
(NULL, NULL, NULL , NULL);
-- DDL and sample data population, end

DECLARE @separator CHAR(1) = '|';

SELECT id, REPLACE((
    SELECT * 
    FROM @tbl AS c
    WHERE c.id = p.id
    FOR XML PATH('r'), TYPE, ROOT('root')
).query('data(/root/r/*[local-name() ne "id"])').value('.', 'VARCHAR(100)') , SPACE(1), @separator) AS concatColumns
FROM @tbl AS p;

输出

+----+---------------+
| id | concatColumns |
+----+---------------+
|  1 | A|B|D         |
|  2 | E|F|G         |
|  3 |               |
+----+---------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2017-06-22
    • 2022-08-15
    • 2020-08-30
    相关资源
    最近更新 更多