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 :