我有一个表,用于存储同一ID的多个值。该表如下所示:
我想用“&”分隔多个值。
所需的输出:
我的查询没有产生期望的输出。以下是我的查询:
create table #temp (cid int, val1 int, val2 int, val3 int, val4 int)
insert #temp values
(1001,10,11,15,19),
(1002,15,Null,16,18),
(1003,14,18,15,NULL)
SELECT distinct t2.cid,
STUFF(( SELECT '&' + REPLACE(t1.val1,'.','') +
REPLACE(t1.val2,'.','') +
REPLACE(t1.val3,'.','') +
REPLACE(t1.val4,'.','')
FROM #temp t1
WHERE t1.cid = t2.cid
FOR XML PATH ('')
), 1, 1,'') as 'output'
FROM #temp t2
注意:我正在使用SQL Server 2014
答案 0 :(得分:3)
对于SQL Server 2017,您可以使用CONCAT_WS(对@Joakim Danielson的补充):
SELECT cid, CONCAT_WS('&', val1, val2, val3, val4)
FROM #temp
对于SQL Server 2012,您可以使用CONCAT:
SELECT cid, CONCAT(val1, '&', val2, '&', val3, '&', val4)
FROM #temp
对于所有版本的SQL Server,您可以使用'+'进行串联。
SELECT cid, val1 + '&' + val2 + '&' + val3 + '&' + val4
FROM #temp
鉴于您的示例包含NULL并似乎正在存储整数,因此我建议以下内容:
SELECT cid
,STUFF(COALESCE( '&' + CONVERT(VARCHAR, val1), '')
+ COALESCE( '&' + CONVERT(VARCHAR, val2), '')
+ COALESCE( '&' + CONVERT(VARCHAR, val3), '')
+ COALESCE('&' + CONVERT(VARCHAR, val4), ''), 1, 1, '')
FROM #temp
*接受编辑以包括STUFF来删除结尾的“&”
COALESCE()的作用是在列表中不包含NULL值,而将CONVERT转换为varchar将处理整数
答案 1 :(得分:2)
为此使用CONCAT_WS
SELECT cid, CONCAT_WS('&', val1, val2, val3, val4)
FROM #temp
答案 2 :(得分:2)
您需要concat_ws()
功能。您可以在SQL Server中执行以下操作:
select t.cid,
stuff( (coalesce('&' + t.val1, '') +
coalesce('&' + t.val2, '') +
coalesce('&' + t.val3, '') +
coalesce('&' + t.val4, '')
), 1, 1, ''
) as vals
from #temp t;
这与我在SQL Server中找到的concat_ws()
最方便。
如果值是整数,则将其强制转换为
select t.cid,
stuff( (coalesce('&' + cast(t.val1 as varchar(255)), '') +
coalesce('&' + cast(t.val2 as varchar(255)), '') +
coalesce('&' + cast(t.val3 as varchar(255)), '') +
coalesce('&' + cast(t.val4 as varchar(255)), '')
), 1, 1, ''
) as vals
from #temp t;
Here是db <>小提琴。
答案 3 :(得分:1)
我有一个表,用于存储同一ID的多个值。
如果CID值不是唯一的:
SELECT DISTINCT
t2.cid,
REPLACE(STUFF(
(
SELECT '|' + CAST(val AS VARCHAR(50))
FROM
(
SELECT cid, val1 AS val FROM #temp
UNION ALL
SELECT cid, val2 AS val FROM #temp
UNION ALL
SELECT cid, val3 AS val FROM #temp
UNION ALL
SELECT cid, val4 AS val FROM #temp
) t1
WHERE t1.cid = t2.cid
AND t1.val IS NOT NULL
FOR XML PATH('')
), 1, 1, ''), '|', '&') AS 'output'
FROM #temp t2;
结果至:
cid output
1001 10&11&15&19
1002 15&16&18
1003 14&18&15
否则,如其他成员正确建议的,CONCAT
或CONCAT_WS
是更优雅的解决方案