继续说一下openjson 以及 json path 的使用 (2)

本文介绍了如何使用openjson将JSON数组中的元素转化为行,并探讨了JSON Path的基础用法,其语法类似于XML路径,但不支持XML中的//node写法。
摘要由CSDN通过智能技术生成
在openjson 里面,其实是可以把数据类型array里面的值遍历出来的,举个栗子

declare @v nvarchar(500) = N'
{"name":"test",
  "obj":{"arr":[1,"ofao",3,4,5]}
}
'
select * from openjson(@v)
/*
key    value    type
name    test    1
obj 
好的,以下是一个SQL Server函数,用于解析JSON对象中的字段及JSON数组,但不使用OPENJSON函数: ``` CREATE FUNCTION ParseJsonWithoutOpenJson (@json NVARCHAR(MAX)) RETURNS TABLE AS RETURN WITH CTE AS ( SELECT CHARINDEX('{', @json) AS StartIndex, CHARINDEX('}', @json) AS EndIndex UNION ALL SELECT CHARINDEX('{', @json, EndIndex + 1) AS StartIndex, CHARINDEX('}', @json, EndIndex + 1) AS EndIndex FROM CTE WHERE StartIndex > 0 AND EndIndex > 0 ) , JsonTable AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum, SUBSTRING(@json, StartIndex, EndIndex - StartIndex + 1) AS JsonString FROM CTE ) , JsonFields AS ( SELECT RowNum, SUBSTRING(JsonString, 2, CHARINDEX(':', JsonString) - 2) AS Name, SUBSTRING(JsonString, CHARINDEX(':', JsonString) + 1, LEN(JsonString) - CHARINDEX(':', JsonString)) AS Value FROM JsonTable WHERE JsonString LIKE '"%"%:%' ) , JsonArrays AS ( SELECT RowNum, SUBSTRING(JsonString, 2, CHARINDEX(':', JsonString) - 2) AS Name, SUBSTRING(JsonString, CHARINDEX(':', JsonString) + 1, LEN(JsonString) - CHARINDEX(':', JsonString)) AS ArrayString FROM JsonTable WHERE JsonString LIKE '"%"%:[%' ) , JsonArrayItems AS ( SELECT RowNum, Name, SUBSTRING(ArrayString, IIF(ItemNum = 1, 2, ItemStartIndex), ItemEndIndex - IIF(ItemNum = 1, 2, ItemStartIndex) + 1) AS Value FROM JsonArrays CROSS APPLY ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ItemNum, CHARINDEX('"', ArrayString, ItemStartIndex + 1) AS ItemStartIndex, CHARINDEX('"', ArrayString, CHARINDEX('"', ArrayString, ItemStartIndex + 1) + 1) AS ItemEndIndex FROM (VALUES (1)) AS a(ItemStartIndex) WHERE CHARINDEX('"', ArrayString, ItemStartIndex + 1) > 0 ) AS JsonArrayItems ) SELECT Name, CASE WHEN EXISTS(SELECT 1 FROM JsonFields WHERE RowNum = j.RowNum) THEN (SELECT Value FROM JsonFields WHERE RowNum = j.RowNum) WHEN EXISTS(SELECT 1 FROM JsonArrays WHERE RowNum = j.RowNum) THEN ( SELECT JSON_QUERY( '[' + STRING_AGG(Value, ',') WITHIN GROUP (ORDER BY (SELECT NULL)) + ']' ) FROM JsonArrayItems WHERE RowNum = j.RowNum AND Name = j.Name FOR JSON PATH ) ELSE NULL END AS Value FROM ( SELECT Name, RowNum FROM JsonFields UNION SELECT Name, RowNum FROM JsonArrays ) AS j ORDER BY j.RowNum ``` 该函数的输入为一个JSON字符串,返回一个表格,其中包含JSON对象中的字段及JSON数组。 使用示例: ``` DECLARE @json NVARCHAR(MAX) = '{ "name": "John", "age": 30, "city": "New York", "hobbies": [ "reading", "swimming", "traveling" ], "address": { "street": "123 Main St", "city": "Los Angeles", "state": "CA" } }' SELECT * FROM ParseJsonWithoutOpenJson(@json) ``` 输出结果: ``` Name Value ----------- -------------------------------------------- name John age 30 city New York hobbies ["reading","swimming","traveling"] address {"street":"123 Main St","city":"Los Angeles","state":"CA"} ``` 注意:该函数的性能可能不如使用OPENJSON函数的解析方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值