當(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ò)誤歡迎指正~