Un solo comando SQL basado en conjuntos es mucho más eficiente que hacer un bucle:
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?
Para responder a su pregunta original:
Porque estabas tratando de convertir el jsonb
valor a integer
. En su solución ya descubrió que necesita el ->>
operador en lugar de ->
para extraer text
, que se puede convertir a integer
.
Su segundo intento agregó un segundo error:
t->'social'::int
Además de lo anterior:precedencia de operadores . El operador de conversión ::
se une más fuerte que el operador json ->
. Como ya te encontraste, realmente quieres:
(t->>'social')::int
Caso muy similar en dba.SE: