gpt4 book ai didi

sql - 在 SQL 中查询 JSON

转载 作者:行者123 更新时间:2023-12-05 07:56:29 25 4
gpt4 key购买 nike

我正在尝试找到一种类似于查询 XML 的方式来在 SQL 中查询 JSON。有任何想法吗?我还没有保存任何数据,所以我很开放,尽管我读过保存 JSON 的最佳方法是使用 varchar(max) 列。

谢谢

例子:

假设以下 JSON 对象存储在 varchar(max) 列中,我想查询该列并提取所有带有“成功”标志 = False 的事务 ID。

{"TransactionID":"sample string 1","Success":true,
"Response":"sample string 3","Values":"sample string 4"}

最佳答案

故事的寓意:不要使用 SQL 执行此操作。 CLR 和 JSON 包装器是可行的方法。但如果你真的很好奇,你可以做如下的事情。可能发生的问题太多了,很难一一列举。关于该主题的快速谷歌将很容易地显示原因。如果你能确保完美完美地形成 JSON 对象,这可能是你可以研究的东西。或许。不要使用它。

/*
JSON to XML Parser TSQL
Compatibility: TEsted on SQL Server 2014
Assumptions: -Perfectly formed JSON as declared below.
-Charecters for formatting are ok but will be removed
*/

--Imagine @JSONDATA would be the parameter to your function
DECLARE @JSONDATA VARCHAR(MAX) = '{"transactions":[
{"TransacitonID":"transaction1","Success":true,"Response":"sample string 1","Values":"sample string 1"},
{"TransactionID":"transaction2","Success":false,"Response":"sample string 2","Values":"sample string 2"}
]}'

DECLARE @ObjectArrayNameStart INT
DECLARE @ObjectArrayNameEnd INT
DECLARE @ObjectArray VARCHAR(MAX)
DECLARE @ObjectArrayName VARCHAR(MAX)
DECLARE @ObjectArrayBracketStart INT
DECLARE @ObjectArrayBracketEnd INT
DECLARE @ObjectArraySingleton VARCHAR(MAX)
DECLARE @ObjectXML XML



--Replace All CR and LF charecters and HT chars
SET @JSONDATA = REPLACE(REPLACE(REPLACE(@JSONDATA,CHAR(10),''),CHAR(13),''),CHAR(9),'') --LF

--Get the ObjectArrayName
SELECT @ObjectArrayNameStart = PATINDEX('%{["]transactions["]:[[]%',@JSONDATA), @ObjectArrayNameEnd = PATINdEX('%[[]%',@JSONDATA)
SET @ObjectArrayName = SUBSTRING(@JSONDATA,@ObjectArrayNameStart,@ObjectArrayNameEnd)

--Get the ObjectArray name
SET @ObjectArray = REPLACE(@JSONDATA,@ObjectArrayName,'')

----Trim out the word of the object array and get the single word and singleton item
SET @ObjectArrayName = LEFT(@ObjectArrayName,@ObjectArrayNameEnd - 3)
SET @ObjectArrayName = RIGHT(@ObjectArrayName, LEN(@ObjectArrayName) - 2)
SET @ObjectArraySingleton = 'node'

--PREP THE JSON OBJECT DOWN TO INDIVIDUAL OBJECTS AND SET AS XML DOCUMENT
SET @ObjectArray = LTRIM(RTRIM(REPLACE(@ObjectArray,']}','')))
SET @ObjectArray = REPLACE(@ObjectArray,'},{','</' + @ObjectArraySingleton + '><' + @ObjectArraySingleton + '>')
SET @ObjectArray = REPLACE(@ObjectArray,'{','<' + @ObjectArraySingleton + '>')
SET @ObjectArray = REPLACE(@ObjectArray,'}','</' + @ObjectArraySingleton + '>')
SET @ObjectArray = '<root>' + @ObjectArray + '</root>'
SET @ObjectXML = CAST(@ObjectArray AS XML)

--Query for line data
;WITH XMLObjectData AS (
SELECT Item.value('text()[1]','nvarchar(max)') AS ObjectLine
FROM @ObjectXML.nodes('/root/node') AS Items(Item)
), CommaSplit AS (
SELECT '<pair><key>' + REPLACE(X.ObjectLine,',','</value></pair><pair><key>') + '</value></pair>' AS ObjectLine
FROM XMLObjectData AS X
), ColonSplit AS (
SELECT REPLACE(X.ObjectLine,':','</key><value>') AS ObjectLine
FROM CommaSplit AS X
), QuoteReplace AS (
SELECT REPLACE(X.ObjectLine,'"','') AS ObjectLine
FROM ColonSplit AS X
)
SELECT CAST(F.ObjectLine AS XML)
FROM QuoteReplace AS F
FOR XML PATH('object'), ROOT('root')


--COMMENTED OUT FOR TESTING
--SELECT @JSONDATA AS JSONData,
-- @ObjectArrayName AS ObjArrayName,
-- @ObjectArrayNameStart AS ObjArrayNameStart,
-- @ObjectArrayNameEnd AS ObjArrayNameEnd,
-- @ObjectArray AS ObjArray,
-- @ObjectArraySingleton AS ObjSingleton
-- --,CAST(@ObjectArray AS XML) AS XMLObjectArray

关于sql - 在 SQL 中查询 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com