sql - 连接没有公共列的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
进行排序,我的数据是随机的,无法排序。
有没有一种方法可以根据表的行号加入表而不首先对其进行排序?
还是有另一种将数据从字符串插入表的方法?
解决方案
您不需要将输入数据拆分和/或插入到单独的表中。在这种情况下,您只需解析输入字符串并获取子字符串及其序号位置(基于 XML 的方法或拆分器函数是可能的解决方案)。
但如果您使用 SQL Server 2016+,基于 JSON 的方法也是一种选择。这个想法是将字符串转换为有效的 JSON 数组 ( 1,2,3
into [1,2,3]
),解析数组OPENJSON()
并加入从OPENJSON()
调用返回的表。如文档中所述,OPENJSON()
函数返回的列(使用默认模式时)是key
,value
并且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
推荐阅读
- python - Spyder 变量资源管理器中的溢出错误
- php - 在 Laravel 上找不到表格的类问题
- asp.net - 向具有不同选项的不同角色显示同一张表
- python - Python:如何解释 0==0<1 返回 True
- html - 如何将带有文本的图像更改为按钮
- java - Micronaut 中 MapStruct 生成的类的 NoSuchBeanException
- mediawiki - MediaWiki - 在允许阅读之前需要确认的电子邮件?
- java - 在我的 java 8 流中查找表中的每一列
- vue.js - 从视图 VUE 定义通用组件方法
- python - 运行终端命令但不通过 python 显示输出