Een op een enkele set gebaseerde SQL-opdracht is veel efficiënter dan lussen:
UPDATE words_social w
SET social = (iu->>'social')::int
FROM JSONB_ARRAY_ELEMENTS(in_users) iu -- in_user = function variable
WHERE w.sid = iu->>'sid'; -- type of sid?
Om je oorspronkelijke vraag te beantwoorden:
Omdat u de jsonb
. probeerde te converteren waarde naar integer
. In je oplossing heb je al gevonden dat je de ->>
. nodig hebt operator in plaats van ->
om text
te extraheren , die kan worden gecast naar integer
.
Uw tweede poging heeft een tweede fout toegevoegd:
t->'social'::int
In aanvulling op het bovenstaande:operatorprioriteit . De cast-operator ::
bindt sterker dan de json-operator ->
. Zoals je jezelf al hebt gevonden, wil je echt:
(t->>'social')::int
Zeer vergelijkbaar geval op dba.SE: