Ett enda uppsättningsbaserat SQL-kommando är mycket effektivare än looping:
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?
För att svara på din ursprungliga fråga:
Eftersom du försökte konvertera jsonb värde till heltal . I din lösning har du redan funnit att du behöver -> för att extrahera text , som kan castas till heltal .
Ditt andra försök lade till ett andra fel:
t->'social'::int
Utöver ovanstående:operatörsföreträde . Cast-operatören :: binder starkare än json-operatorn -> . Som du redan har hittat dig själv vill du verkligen:
(t->>'social')::int
Mycket liknande fall på dba.SE: