簡體   English   中英

如何在SQL中替換json字符串中的數字數組?

[英]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 foreachJSON.parseJSON.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM