首页 > 解决方案 > 连接没有公共列的sql表而不排序

问题描述

我的数据采用 2 个逗号分隔的字符串形式

DECLARE @ids nvarchar(max) = '1,2,3'
DECLARE @guids nvarchar(max) = 
'0000000-0001-0000-0000-000000000000,
`0000000-0022-0000-0000-000000000000`,
`0000000-0013-0000-0000-000000000000'`

我需要根据它们在字符串中的位置将它们作为单独的列放在表中

Table1
| Id | Guid                                |
| 1  | 0000000-0001-0000-0000-000000000000 |
| 2  | 0000000-0022-0000-0000-000000000000 |
| 3  | 0000000-0013-0000-0000-000000000000 |

我可以使用将两个字符串拆分为单独的表

DECLARE @split_ids
(value nvarchar(max))

DECLARE @xml xml
SET @xml = N'<root><r>' + replace(@ids, ',' ,'</r><r>') + '</r></root>'

INSERT INTO @split_ids(Value)
SELECT r.value('.','nvarchar(max)')
FROM @xml.nodes('//root/r') as records(r)

我试过了

 SELECT t1.*, t2.*
 FROM (SELECT t1.*, row_number() OVER (ORDER BY [Value]) as seqnum
  from cte_Ids t1
 ) t1 FULL OUTER  JOIN
 (SELECT t2.*, row_number() OVER (ORDER BY [Value]) as seqnum
  from cte_barcodes t2
 ) t2
 ON t1.seqnum = t2.seqnum;

但这对表格Value进行排序,我的数据是随机的,无法排序。

有没有一种方法可以根据表的行号加入表而不首先对其进行排序?

还是有另一种将数据从字符串插入表的方法?

标签: sqlsql-serverjoin

解决方案


您不需要将输入数据拆分和/或插入到单独的表中。在这种情况下,您只需解析输入字符串并获取子字符串及其序号位置(基于 XML 的方法或拆分器函数是可能的解决方案)。

但如果您使用 SQL Server 2016+,基于 JSON 的方法也是一种选择。这个想法是将字符串转换为有效的 JSON 数组 ( 1,2,3into [1,2,3]),解析数组OPENJSON()并加入从OPENJSON()调用返回的表。如文档中所述OPENJSON()函数返回的列(使用默认模式时)是keyvalue并且type在 JSON 数组的情况下,该key列保存指定数组中元素的索引。

DECLARE @ids nvarchar(max) = N'1,2,3'
DECLARE @guids nvarchar(max) =  N'0000000-0001-0000-0000-000000000000,0000000-0022-0000-0000-000000000000,0000000-0013-0000-0000-000000000000'

SELECT j1.[value] AS Id, j2.[value] AS Guid
FROM OPENJSON(CONCAT('[', @ids, ']')) j1
JOIN OPENJSON(CONCAT('["', REPLACE(@guids, ',', '","'), '"]')) j2 ON j1.[key] = j2.[key]

结果:

Id  Guid
1   0000000-0001-0000-0000-000000000000
2   0000000-0022-0000-0000-000000000000
3   0000000-0013-0000-0000-000000000000

推荐阅读