SQL中的资料查询

时间:2019-02-12 21:22:04

标签: sql sql-server

我有一个表,用于存储同一ID的多个值。该表如下所示:

enter image description here

我想用“&”分隔多个值。

所需的输出:

enter image description here

我的查询没有产生期望的输出。以下是我的查询:

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

4 个答案:

答案 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

否则,如其他成员正确建议的,CONCATCONCAT_WS是更优雅的解决方案