Un singolo comando SQL basato su set è molto più efficiente del ciclo:
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?
Per rispondere alla tua domanda originale:
Perché stavi cercando di convertire il jsonb
valore a integer
. Nella tua soluzione hai già scoperto che ti serve il ->>
operatore invece di ->
per estrarre text
, che può essere convertito in integer
.
Il tuo secondo tentativo ha aggiunto un secondo errore:
t->'social'::int
Oltre a quanto sopra:precedenza dell'operatore . L'operatore di cast ::
si lega più forte dell'operatore json ->
. Come ti sei già trovato, vuoi davvero:
(t->>'social')::int
Caso molto simile su dba.SE: