[英]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.