如何从 SQL 服务器中的 JSON 列中提取数组数据(OPENJSON、JSON_QUERY)
How to extract array data from a JSON Column in SQL Server (OPENJSON, JSON_QUERY)
我们有一个 SQL 服务器 table,它有一个带有 JSON 数据的 varchar(max) 列,但其中一个字段是一个数组。尽我所能,我无法让它每行提取一个。在过去,我设法在每个数组由命名成员组成的地方做到这一点,因此使用另一个 CROSS APPLY WITH (...) 并命名成员。但是正在努力弄清楚如何使用更简单的值列表来做到这一点。
伪代码:
DROP TABLE IF EXISTS #MyTable
CREATE TABLE #MyTable (
Id uniqueidentifier
,MyJsonText nvarchar(max))
INSERT INTO #MyTable(Id, MyJsonText) VALUES
('EDA4A604-59F4-4E4E-9C20-08D82314D8F6', '{"InitialCost":75.0,"OtherCost":50.0,"DatesOfVisit":["Wed, 26 Feb 2020 00:00:00 GMT","Fri, 20 Mar 2020 00:00:00 GMT"],"CatNumber":"PH123456"}')
SELECT ISJSON(MyJsonText) FROM #MyTable -- Check JSON ok
SELECT
mt.Id
,mt_j.InitialCost
,mt_j.OtherCost
,mt_j.CatNumber
FROM #MyTable mt
CROSS APPLY OPENJSON(mt.MyJsonText) WITH (
InitialCost decimal(8,2)
,OtherCost decimal(8,2)
,CatNumber varchar(50)) as mt_j
上面使用了来自 JSON 的“顶级”数据,但是我如何 return 这个:
Id InitialCost OtherCost DatesOfVisit CatNumber
EDA4A604-59F4-4E4E-9C20-08D82314D8F6 75.00 50.00 Wed, 26 Feb 2020 00:00:00 GMT PH123456
EDA4A604-59F4-4E4E-9C20-08D82314D8F6 75.00 50.00 Fri, 20 Mar 2020 00:00:00 GMT PH123456
非常感谢任何指导!
嵌套您的 JSON 电话:
SELECT MT.Id,
JT.InitialCost,
JT.OtherCost,
DV.value AS DateOfVisit
FROM #MyTable MT
CROSS APPLY OPENJSON(MT.MyJsonText)
WITH (InitialCost decimal(8,2),
OtherCost decimal(8,2),
DatesOfVisit nvarchar(MAX) AS JSON) JT
CROSS APPLY OPENJSON(DatesOfVisit) DV;
我们有一个 SQL 服务器 table,它有一个带有 JSON 数据的 varchar(max) 列,但其中一个字段是一个数组。尽我所能,我无法让它每行提取一个。在过去,我设法在每个数组由命名成员组成的地方做到这一点,因此使用另一个 CROSS APPLY WITH (...) 并命名成员。但是正在努力弄清楚如何使用更简单的值列表来做到这一点。
伪代码:
DROP TABLE IF EXISTS #MyTable
CREATE TABLE #MyTable (
Id uniqueidentifier
,MyJsonText nvarchar(max))
INSERT INTO #MyTable(Id, MyJsonText) VALUES
('EDA4A604-59F4-4E4E-9C20-08D82314D8F6', '{"InitialCost":75.0,"OtherCost":50.0,"DatesOfVisit":["Wed, 26 Feb 2020 00:00:00 GMT","Fri, 20 Mar 2020 00:00:00 GMT"],"CatNumber":"PH123456"}')
SELECT ISJSON(MyJsonText) FROM #MyTable -- Check JSON ok
SELECT
mt.Id
,mt_j.InitialCost
,mt_j.OtherCost
,mt_j.CatNumber
FROM #MyTable mt
CROSS APPLY OPENJSON(mt.MyJsonText) WITH (
InitialCost decimal(8,2)
,OtherCost decimal(8,2)
,CatNumber varchar(50)) as mt_j
上面使用了来自 JSON 的“顶级”数据,但是我如何 return 这个:
Id InitialCost OtherCost DatesOfVisit CatNumber
EDA4A604-59F4-4E4E-9C20-08D82314D8F6 75.00 50.00 Wed, 26 Feb 2020 00:00:00 GMT PH123456
EDA4A604-59F4-4E4E-9C20-08D82314D8F6 75.00 50.00 Fri, 20 Mar 2020 00:00:00 GMT PH123456
非常感谢任何指导!
嵌套您的 JSON 电话:
SELECT MT.Id,
JT.InitialCost,
JT.OtherCost,
DV.value AS DateOfVisit
FROM #MyTable MT
CROSS APPLY OPENJSON(MT.MyJsonText)
WITH (InitialCost decimal(8,2),
OtherCost decimal(8,2),
DatesOfVisit nvarchar(MAX) AS JSON) JT
CROSS APPLY OPENJSON(DatesOfVisit) DV;