简体   繁体   English

连接多个具有空值的列

[英]Concatenate multiple columns, with null values

I want to concatenate multiple columns, separated by ; 我想串联多个列,以;分隔 , in MS-SQL Server 2008. ,在MS-SQL Server 2008中。

The problem that I have is that without the CONCAT() I don't know how to handle NULL columns and not have results like this tattoos;comics;;; 我遇到的问题是,没有CONCAT()我将不知道如何处理NULL列,也不会得到像这样的结果tattoos;comics;;;

Here you have the script to create the sample data: 在这里,您具有创建示例数据的脚本:

declare @tbl as table (
    id int
    ,kw1 varchar(15)
    ,kw2 varchar(15)
    ,kw3 varchar(15)
    ,kw4 varchar(15)
    ,kw5 varchar(15)
);

insert into @tbl values
(1, 'innocence', 'graphic novel', 'cartoon', NULL, 'comics')
,(2, 'tattoos', 'comics', NULL, NULL, NULL)
,(3, NULL, 'music', 'cartoon', 'adventure', 'film') 

And the table: 和表:

+----+-----------+---------------+---------+-----------+--------+
| id |    kw1    |      kw2      |   kw3   |    kw4    |  kw5   |
+----+-----------+---------------+---------+-----------+--------+
|  1 | innocence | graphic novel | cartoon | NULL      | comics |
|  2 | tattoos   | comics        | NULL    | NULL      | NULL   |
|  3 | NULL      | music         | cartoon | adventure | film   |
+----+-----------+---------------+---------+-----------+--------+

So my actual result is this: 所以我的实际结果是这样的:

+----+-----------------------------------------+
| id |                Keywords                 |
+----+-----------------------------------------+
|  1 | innocence;graphic novel;cartoon;;comics |
|  2 | tattoos;comics;;;                       |
|  3 | ;music;cartoon;adventure;film           |
+----+-----------------------------------------+

But this is what i want: 但这就是我想要的:

+----+----------------------------------------+
| id |                Keywords                |
+----+----------------------------------------+
|  1 | innocence;graphic novel;cartoon;comics |
|  2 | tattoos;comics                         |
|  3 | music;cartoon;adventure;film           |
+----+----------------------------------------+

Query: 查询:

SET CONCAT_NULL_YIELDS_NULL OFF;

select
    id
    ,kw1 + ';' + kw2 + ';' + kw3 + ';' + kw4 + ';' + kw5 as Keywords
FROM @tbl

Any help is appreciated! 任何帮助表示赞赏!

In the absence of CONCAT() (SQL Server 2008+) you can use ISNULL() like so: 在没有CONCAT() (SQL Server 2008+)的情况下,可以这样使用ISNULL()

SELECT 
    t.id ,
    ISNULL(t.kw1 + ';', '') + ISNULL(t.kw2 + ';', '') +
    ISNULL(t.kw3 + ';', '') + ISNULL(t.kw4 + ';', '') +
    ISNULL(t.kw5 + ';', '') AS Vals
FROM
    @tbl AS t;

If the column value is NULL then the joining of NULL + ';' 如果列值为NULL则连接NULL + ';' would produce NULL , therefore giving you the empty string instead '' . 会产生NULL ,因此给你空字符串''

For 2008+ you'd use CONCAT() like so: 对于2008+,您将像这样使用CONCAT()

SELECT 
    t.id ,
    CONCAT(t.kw1 + ';' ,t.kw2 + ';',t.kw3 + ';' ,t.kw4 + ';', t.kw5+ ';') as Vals
FROM 
    @tbl AS t

Both produce this result: 两者都会产生以下结果:

id          Vals
----------- -----------------------------------------------
1           innocence;graphic novel;cartoon;comics;
2           tattoos;comics;
3           music;cartoon;adventure;film;

For now, I found only the way of getting output exactly what you have mentioned using CASE so you can try and use it: 现在,我只找到了使用CASE获得与您刚才提到的内容完全相同的输出的方法,因此可以尝试使用它:

SELECT
id,
keywords = (
CASE WHEN kw1 IS NOT NULL THEN kw1 + CASE WHEN COALESCE(kw2,kw3,kw4,kw5) IS NOT NULL THEN ';' ELSE '' END ELSE '' END +
CASE WHEN kw2 IS NOT NULL THEN kw2 + CASE WHEN COALESCE(kw3,kw4,kw5) IS NOT NULL THEN ';' ELSE '' END ELSE '' END +
CASE WHEN kw3 IS NOT NULL THEN kw3 + CASE WHEN COALESCE(kw4,kw5) IS NOT NULL THEN ';' ELSE '' END ELSE '' END +
CASE WHEN kw4 IS NOT NULL THEN kw4 + CASE WHEN kw5 IS NOT NULL THEN ';' ELSE '' END ELSE '' END +
CASE WHEN kw5 IS NOT NULL THEN kw5 ELSE '' END)
FROM @tbl

OUTPUT: OUTPUT:

id  keywords
-----------------------------------------
1   innocence;graphic novel;cartoon;comics
2   tattoos;comics
3   music;cartoon;adventure;film

您可以尝试以下方法:

     select ISNULL(kwa1,'') + ';' + ISNULL(kw2,'') from TABLENAME

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM