首页 > 解决方案 > 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

标签: sqlsql-servertsql

解决方案


使用 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

推荐阅读