Pojedyncze polecenie SQL oparte na zbiorze jest o wiele bardziej wydajne niż pętla:
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?
Aby odpowiedzieć na Twoje pierwotne pytanie:
Ponieważ próbowałeś przekonwertować jsonb
wartość do integer
. W swoim rozwiązaniu już stwierdziłeś, że potrzebujesz ->>
operator zamiast ->
wyodrębnić text
, które można rzutować na integer
.
Druga próba dodała drugi błąd:
t->'social'::int
Oprócz powyższych:pierwszeństwo operatorów . Operator rzutowania ::
wiąże silniej niż operator json ->
. Jak już się znalazłeś, naprawdę chcesz:
(t->>'social')::int
Bardzo podobny przypadek na dba.SE: