我有一個型別的列,jsonb其中包含表單的 json 陣列
[
{
"Id": 62497,
"Text": "BlaBla"
}
]
我想將 更新為來自不同表Id的列word_id(型別)的值。uuidword
我試過這個
update inflection_copy
SET inflectionlinks = s.json_array
FROM (
SELECT jsonb_agg(
CASE
WHEN elems->>'Id' = (
SELECT word_copy.id::text
from word_copy
where word_copy.id::text = elems->>'Id'
) THEN jsonb_set(
elems,
'{Id}'::text [],
(
SELECT jsonb(word_copy.word_id::text)
from word_copy
where word_copy.id::text = elems->>'Id'
)
)
ELSE elems
END
) as json_array
FROM inflection_copy,
jsonb_array_elements(inflectionlinks) elems
) s;
直到現在我總是收到以下錯誤:
invalid input syntax for type json
DETAIL: Token "c66a4353" is invalid.
CONTEXT: JSON data, line 1: c66a4353...
c66a4535是表的其中一個uuidword的一部分。我不明白為什么這被標記為無效輸入。
編輯:
舉一個 uuid 的例子:
select to_jsonb(word_id::text) from word_copy limit(5);
回傳
----------------------------------------
| to_jsonb |
|----------------------------------------|
| "078c979d-e479-4fce-b27c-d14087f467c2" |
| "ef288256-1599-4f0f-a932-aad85d666c9a" |
| "d1d95b60-623e-47cf-b770-de46b01042c5" |
| "f97464c6-b872-4be8-9d9d-83c0102fb26a" |
| "9bb19719-e014-4286-a2d1-4c0cf7f089fc" |
----------------------------------------
根據各列id和表格word_id的要求word:
---------------------------------------------------
| row |
|---------------------------------------------------|
| ('27733', '078c979d-e479-4fce-b27c-d14087f467c2') |
| ('72337', 'ef288256-1599-4f0f-a932-aad85d666c9a') |
| ('72340', 'd1d95b60-623e-47cf-b770-de46b01042c5') |
| ('27741', 'f97464c6-b872-4be8-9d9d-83c0102fb26a') |
| ('72338', '9bb19719-e014-4286-a2d1-4c0cf7f089fc') |
---------------------------------------------------
---------------- ---------- ----------------------------
| Column | Type | Modifiers |
|---------------- ---------- ----------------------------|
| id | bigint | |
| value | text | |
| homonymnumber | smallint | |
| pronounciation | text | |
| audio | text | |
| level | integer | |
| alpha | bigint | |
| frequency | bigint | |
| hanja | text | |
| typeeng | text | |
| typekr | text | |
| word_id | uuid | default gen_random_uuid() |
---------------- ---------- ----------------------------
uj5u.com熱心網友回復:
我建議你修改你的子查詢如下:
update inflection_copy AS ic
SET inflectionlinks = s.json_array
FROM
(SELECT jsonb_agg(CASE WHEN wc.word_id IS NULL THEN e.elems ELSE jsonb_set(e.elems, array['Id'], to_jsonb(wc.word_id::text)) END ORDER BY e.id ASC) AS json_array
FROM inflection_copy AS ic
CROSS JOIN LATERAL jsonb_path_query(ic.inflectionlinks, '$[*]') WITH ORDINALITY AS e(elems, id)
LEFT JOIN word_copy AS wc
ON wc.id::text = e.elems->>'Id'
) AS s
當沒有對應于的 時,該LEFT JOIN子句將回傳,因此在中沒有改變。wc.word_id = NULLwc.ide.elems->>'id'e.elemsCASE
ORDER BY聚合函式中的子句jsonb_agg將確保 jsonb 陣列中的順序不變。
jsonb_path_query用于代替,jsonb_array_elements以便在ic.inflectionlinks不是 jsonb 陣列時不引發錯誤,并且在寬松模式下使用(這是默認行為)。
在dbfiddle中查看測驗結果
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/525652.html
