sql - SQL查询拆分由对组成的长字符串
问题描述
我需要有关 SQL 查询的帮助。我有表:
线路ID | 点轴 |
---|---|
25 | [(2,4), (3,5), (7,13)] |
26 | [(3,6),(4,8)] |
27 | [(4,5), (5,6), (6,7), (7,8)] |
例如:
LineID: 25 PointAxis: [(x1,y1), (x2,y2),(x3,y3)]
我想拆分我的 SQL 查询(用于绘制曲线等其他目的),如果查询的结果可能是这样的,那将是最好的:
线路ID | 点轴 | X | 是的 | x2 | y2 | x3 | y3 | x4 | y4 |
---|---|---|---|---|---|---|---|---|---|
25 | [(2,4), (3,5), (7,13)] |
2 | 4 | 3 | 5 | 7 | 13 | 无效的 | 无效的 |
26 | [(3,6),(4,8)] |
3 | 6 | 4 | 8 | 无效的 | 无效的 | 无效的 | 无效的 |
27 | [(4,5), (5,6), (6,7), (7,8)] |
4 | 5 | 5 | 6 | 6 | 7 | 7 | 8 |
编辑:我尝试使用 substring 和 charindex 拆分字符串。但是我必须定义字符串的所有变体/长度,这非常复杂。不是更聪明吗?
SELECT [LineID]
,Substring (PointAxis, Charindex( '(', PointAxis) + 1,
Charindex(',',PointAxis)-3) AS [x] FROM [table] t
即使这样的输出也很好:
线路ID | 点轴 | X | 是的 |
---|---|---|---|
25 | [(2,4), (3,5), (7,13)] |
2 | 4 |
25 | [(2,4), (3,5), (7,13)] |
3 | 5 |
25 | [(2,4), (3,5), (7,13)] |
7 | 13 |
解决方案
使用 v2016,您可能会使用 JSON 的一些帮助:
declare @v nvarchar(100)=N'[(2,4), (3,5), (7,13)]';
SELECT A.[key] AS Position
,JSON_VALUE(A.[value],N'$[0]') AS X
,JSON_VALUE(A.[value],N'$[1]') AS Y
FROM OPENJSON(REPLACE(REPLACE(@v,N'(',N'['),N')',N']')) A
简而言之:
- 我们将 替换为
()
将[]
您的字符串转换为 JSON 数组,其中每个元素本身就是一个 JSON 数组。 - 现在我们可以用它
OPENJSON
来潜入周围的数组。 key
返回数组中的位置JSON_VALUE
允许通过其位置获取数组的每个项目。
从 v2017 开始,您可以使用TRANSLATE
而不是REPLACE
FROM OPENJSON(TRANSLATE(@v,N'()',N'[]')) A
表格输入的更新
尝试这个
DECLARE @dummyTable TABLE(ID INT IDENTITY, LineCoords VARCHAR(1000));
INSERT INTO @dummyTable VALUES('[(2,4), (3,5), (7,13)]')
,('[(3,6),(4,8)]')
,('[(4,5), (5,6), (6,7), (7,8)]');
SELECT t.ID
,A.[key] AS Position
,JSON_VALUE(A.[value],N'$[0]') AS X
,JSON_VALUE(A.[value],N'$[1]') AS Y
FROM @dummyTable t
OUTER APPLY OPENJSON(REPLACE(REPLACE(t.LineCoords,N'(',N'['),N')',N']')) A
推荐阅读
- amazon-web-services - 在高延迟的网络上缓慢的第一个 Jenkins 工作
- jquery - 从总分钟数计算年份,同时考虑闰年
- sql - 如何显示不同列中两个值组合的倒数第二个日期
- apache-flink - 输出中存在重复键
- amazon - 如何在不注册 Associate Program 的情况下获取 Amazon 产品信息?
- mysql - 出现语法错误,但非常不确定出了什么问题
- c - 如何在没有 strstr 函数的情况下更改此代码?
- mysql - MySQL解析\u0080以上的字符
- asp.net-core - ASP.NET Core 2.0 - 用户在一小时内注销
- java - 通过 JDBC URL 使用 TestContainers DB 但使用 @Rule 时出错