Une seule commande SQL basée sur un ensemble est bien plus efficace qu'une boucle :
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?
Pour répondre à votre question initiale :
Parce que vous essayiez de convertir le jsonb valeur en integer . Dans votre solution, vous avez déjà trouvé que vous avez besoin du ->> opérateur au lieu de -> pour extraire le text , qui peut être casté en integer .
Votre deuxième tentative a ajouté une deuxième erreur :
t->'social'::int
En plus de ce qui précède :priorité des opérateurs . L'opérateur de cast :: se lie plus fort que l'opérateur json -> . Comme si vous vous étiez déjà trouvé, vous voulez vraiment :
(t->>'social')::int
Cas très similaire sur dba.SE :