MS-SQL Server 2008多列拼接含NULL值问题求助
解决SQL Server 2008中多列拼接时NULL导致多余分号的问题
在SQL Server 2008里没有CONCAT()函数,直接拼接NULL字段确实会产生多余的分号。这里给你两种实用的解决方法,都能完美得到你想要的结果:
方法一:使用STUFF + ISNULL处理(推荐)
这种方法通过给每个非NULL字段前添加分号,再统一移除开头的分号,彻底避免多余分隔符:
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'); SELECT id, STUFF( ISNULL(';' + kw1, '') + ISNULL(';' + kw2, '') + ISNULL(';' + kw3, '') + ISNULL(';' + kw4, '') + ISNULL(';' + kw5, ''), 1, 1, '' ) AS Keywords FROM @tbl;
原理说明:
ISNULL(';' + kw1, ''):如果kw1不为NULL,就返回;字段值;如果是NULL,就返回空字符串。这样每个有效字段都会带上前置分号,NULL字段不会贡献任何内容。- 拼接后第一行的临时结果是
;innocence;graphic novel;cartoon;comics,第二行是;tattoos;comics,第三行是;music;cartoon;adventure;film。 STUFF(..., 1, 1, ''):从拼接字符串的第1位开始,删除1个字符(也就是开头的分号),最终得到干净的拼接结果。
方法二:使用LEFT + LEN移除末尾分号
另一种思路是给每个非NULL字段添加后置分号,拼接后再去掉最后一个分号:
SELECT id, CASE WHEN ISNULL(kw1 + kw2 + kw3 + kw4 + kw5, '') = '' THEN '' ELSE LEFT( ISNULL(kw1 + ';', '') + ISNULL(kw2 + ';', '') + ISNULL(kw3 + ';', '') + ISNULL(kw4 + ';', '') + ISNULL(kw5 + ';', ''), LEN(ISNULL(kw1 + ';', '') + ISNULL(kw2 + ';', '') + ISNULL(kw3 + ';', '') + ISNULL(kw4 + ';', '') + ISNULL(kw5 + ';', '')) - 1 ) END AS Keywords FROM @tbl;
原理说明:
ISNULL(kw1 + ';', ''):非NULL字段会变成字段值;,NULL字段返回空。- 拼接后第一行的临时结果是
innocence;graphic novel;cartoon;comics;,我们用LEFT截取长度减1的字符,去掉末尾的分号。 - 加上
CASE判断是为了处理所有字段都是NULL的情况,避免出现长度为-1的错误。
结果验证
两种方法运行后都会得到你期望的结果:
| id | Keywords |
|---|---|
| 1 | innocence;graphic novel;cartoon;comics |
| 2 | tattoos;comics |
| 3 | music;cartoon;adventure;film |
内容的提问来源于stack exchange,提问作者Valerica
相关产品推荐
相关产品推荐

