[英]How can I go about replacing a number array inside a json string in SQL?
SQL中的數據在單元格中包含一個冗長的JSON字符串,類似於:
{
"Name": "Example",
"Results": [
{
"ResultId": 0,
"AnswerIds": "[1,2,33,4,5]"
},
{
"ResultId": 1,
"AnswerIds": "[2,3,4,55,6]"
}
]
}
我有一個替換的AnswerIds列表:將所有2替換為7,將所有3替換為8
我怎樣才能為此制作腳本?
我能夠使用crossapply和JSON_Query隔離AnswerIds,但不知道如何更換一個數組中的多個更改。
const json = { "Name": "Example", "Results": [ { "ResultId": 0, "AnswerIds": "[1,2,33,4,5]" }, { "ResultId": 1, "AnswerIds": "[2,3,4,55,6]" } ] } json.Results.forEach((itm, index)=> { const arr = JSON.parse(itm.AnswerIds); const replacedArray = arr.map(num=>{ if(num === 2) return 7; if(num === 3) return 8; return num; }); json.Results[index].AnswerIds = JSON.stringify(replacedArray); }) console.log(json);
這就是我所做的,使用json.Results數組並使用forEach循環迭代它。
然后,您可以訪問每個結果的AnswerIds對象。
由於AnswerIds值是一個字符串,我們首先將其轉換為數組。
然后我們使用地圖循環遍歷該數組,並進行替換。
您可能想要閱讀JS地圖和JS foreach , JSON.parse , JSON.stringify
SQL Server 2016具有JSON支持,但您未指定SQL版本。 使用DelimitedSplit8k你可以這樣做:
-- SAMPLE STRING
DECLARE @string VARCHAR(1000) =
'{
"Name": "Example",
"Results": [
{
"ResultId": 0,
"AnswerIds": "[1,2,33,4,5]"
},
{
"ResultId": 1,
"AnswerIds": "[2,3,4,55,6]"
}
]
}';
-- SOLUTION
SELECT NewJSON =
(
SELECT
IIF(i.pos = 0,IIF(i.pos>0 AND sub.string IN(2,3), x.x, sub.string),
IIF(s2.ItemNumber=1,'"[','')+IIF(i.pos>0 AND sub.string IN(2,3),x.x,sub.string)) +
IIF(s2.ItemNumber>LEAD(s2.ItemNumber,1) OVER (ORDER BY s.ItemNumber,s2.ItemNumber),']"',
IIF(i.pos = 0,'',','))
FROM dbo.delimitedsplit8k(REPLACE(@string,CHAR(13),''),CHAR(10)) AS s
CROSS APPLY (VALUES(CHARINDEX('"AnswerIds": "',s.item))) AS i(pos)
CROSS APPLY (VALUES(SUBSTRING(s.item, i.pos+14, 8000))) AS ss(item)
CROSS APPLY dbo.delimitedsplit8k(ss.item,IIF(i.pos=0,CHAR(0),',')) AS s2
CROSS APPLY (VALUES(IIF(i.pos=0,s.item,
REPLACE(REPLACE(s2.item,']"',''),'[','')))) AS sub(string)
CROSS APPLY (VALUES(REPLACE(REPLACE(sub.string,'2',7),'3',8))) AS x(x)
ORDER BY s.ItemNumber, s2.ItemNumber
FOR XML PATH('')
);
返回:
{
"Name": "Example",
"Results": [
{
"ResultId": 0,
"AnswerIds": "[1,7,33,4,5]"
},
{
"ResultId": 1,
"AnswerIds": "[7,8,4,55,6]"
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.