我有下表:
CREATE TABLE [dbo].[PRC_Tutors]
(
[ID] [int] NOT NULL,
[UserID] [int] NOT NULL,
[LivelloZoom] [int] NULL,
[PosizioneGIS] [nvarchar](max) NULL,
CONSTRAINT [PK_PRC_Tutors]
PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
这是插入查询:
INSERT INTO [dbo].[PRC_Tutors] ([ID], [UserID], [LivelloZoom], [PosizioneGIS])
VALUES (1, 1, 18, 'POLYGON((10.932815861897701 45.598233964590946,11.138809514241451 44.993985917715946,12.270401311116451 44.969266679434696,12.152298283772701 45.529569413809696,10.932815861897701 45.598233964590946))')
INSERT INTO [dbo].[PRC_Tutors] ([ID], [UserID], [LivelloZoom], [PosizioneGIS])
VALUES (2, 100, 10, 'POLYGON((12.053217932309531 44.2095244414735,12.261958166684531 44.14085989069225,12.341609045590781 44.280935574286,12.168574377622031 44.42650442194225,12.053217932309531 44.2095244414735))')
这是我的查询,返回 JSON:
SELECT
CAST((SELECT
'OK' As [status],
TU.livelloZoom AS livelloZoom,
(SELECT REPLACE(REPLACE(N.PosizioneGIS, 'POLYGON((',''), '))', '') AS area
FROM AA_V_PRC_Tutors N
WHERE N.ID = TU.ID
FOR JSON PATH, INCLUDE_NULL_VALUES) AS area
FROM
AA_V_PRC_Tutors TU
WHERE
UserID = @User_id
FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER) AS nvarchar(max))
这是此查询的 JSON 输出:
{
"status":"OK",
"livelloZoom":18,
"area":[
{"area":"10.932815861897701 45.598233964590946,
11.138809514241451 44.993985917715946,
12.270401311116451 44.969266679434696,
12.152298283772701 45.529569413809696,
10.932815861897701 45.598233964590946"
}
]
}
但我需要生成以下 JSON:
{
"status":"OK",
"livelloZoom":18,
"area":[
[10.932815861897701, 45.598233964590946],
[11.138809514241451, 44.993985917715946],
[12.270401311116451, 44.969266679434696],
[12.152298283772701, 45.529569413809696],
[10.932815861897701, 45.598233964590946]
]
}
我怎样才能获取该 JSON?
有几种方法可以解决这个问题:
REPLACE()
使用和嵌套操作的组合将 WKT 坐标解析为单个元素STRING_SPLIT()
,然后将它们重建为 JSON 数组。REPLACE()
直接将 WKT 转换为 JSON 嵌套数组语法,并将其包含在结果中JSON_QUERY()
。下面使用第三种技术。限制是原始数据必须精确遵循预期格式 - 没有多余的空格或其他变化。
示例结果(使用jsonformatter.org格式化):
参见这个 db<>fiddle。
首先,您不需要
AA_V_PRC_Tutors N
引用,您可以直接引用外部列。您也不需要转换为,nvarchar(max)
因为这是的默认输出FOR JSON
。不幸的是,SQL Server 尚不支持
JSON_AGG
,这意味着我们需要对其进行破解STRING_AGG
,然后使用 来防止双重转义JSON_QUERY
。因此,为了获得结果,我们需要将您的数据转换为实际
geometry
类型(不确定为什么一开始不是这样),然后使用STPointN
来获取每个点。因此,我们还需要GENERATE_SERIES
和STNumPoints
来生成足够的人工行。db<>小提琴
鉴于您使用的是 SQL Server 2016,您没有
STRING_AGG
,所以我们需要使用旧的FOR XML PATH('')
hack。而您也没有,GENERATE_SERIES
所以我们需要使用Itzik Ben-Gan 的交叉连接生成器。db<>小提琴