SQL的一些小知識(shí)呀(8)-更新字段中的json

當(dāng)數(shù)據(jù)庫(kù)所存的某一個(gè)字段是json時(shí),如何更新其中的某個(gè)value呢?

select data from table where id=1;
data字段所存為json數(shù)據(jù),如下
{
  "key1": [
    { "m": "ABC", "s": 0 },
    { "m": "DEF", "s": 33 }
  ],
  "key2": [
    {
      "m1": 3,
      "m2": 4
    }
  ]
}

以上述數(shù)據(jù)為例,想要更新{ "m": "DEF", "s": 33 },把s的值在原基礎(chǔ)上加1,可通過(guò)下方語(yǔ)句實(shí)現(xiàn):
第1步:拿出 "key1"

select "data" #> '{key1}' key1_json
from table;

得到的結(jié)果:


key1_json

第2步:把json數(shù)組進(jìn)行拆解

select json_array_elements(key1_json) -> 'm' m, json_array_elements(key1_json) -> 's' s
from (
        select "data" #> '{key1}' key1_json
from table
     )  t1;

得到的結(jié)果:

拆解json

第3步:拿到{ "m": "DEF", "s": 33 },及單獨(dú)的s值

select '{"m": "DEF", "s": ' || s || '}' total, s::TEXT::float s
from (
select json_array_elements(key1_json) -> 'm' m, json_array_elements(key1_json) -> 's' s
from (
        select "data" #> '{key1}' key1_json
from table
     )  t1)t2
where m::TEXT= '"DEF"';

得到的結(jié)果:


需要進(jìn)行替換前的元素

第4步:更新s值

update table
set "data" = replace("data"::text, t3.total, '{"m": "DEF", "s": ' || s + 1 || '}')::json
from (
         select '{"m": "DEF", "s": ' || s || '}' total, s::TEXT::float s
         from (
                  select json_array_elements(key1_json) -> 'm' m, json_array_elements(key1_json) -> 's' s
                  from (
                           select key3.key #> '{key1}' key1_json
                           from (
                                    select ('{
  "key1": [
    { "m": "ABC", "s": 0 },
    { "m": "DEF", "s": 33 }
  ]
}')::json as key) key3) t1) t2
         where m::TEXT = '"DEF"') t3;

大結(jié)局,就完成更新了~

long time no see,自從上次emo之后,接了新的工作,其實(shí)與測(cè)試的相關(guān)性沒(méi)有那么強(qiáng),但是仍然是在不斷接觸學(xué)習(xí)新東西。甚至經(jīng)歷了漫長(zhǎng)的疫情復(fù)工后,直到今天才有時(shí)間來(lái)這里更新...這個(gè)sql也是最近工作接觸到的,覺(jué)得有點(diǎn)子難...雖然我當(dāng)時(shí)是直接copy就可以了,但仍然想記錄下來(lái),就暫時(shí)達(dá)到一個(gè)能看懂的目的吧~

因?yàn)椴怀y(cè)試,最近對(duì)于新提交的東西甚至忘了測(cè)試...也是有些迷,接下來(lái)就不要醬紫了吧

下半年已經(jīng)開(kāi)始了,今天更新是一個(gè)好的開(kāi)始,希望下半年能開(kāi)心充實(shí)的過(guò)吧~~

自我記錄,有錯(cuò)誤歡迎指正~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容