Um único comando SQL baseado em conjunto é muito mais eficiente do que o loop:
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 à sua pergunta original:
Porque você estava tentando converter o
jsonb
valor para integer
. Em sua solução, você já descobriu que precisa do ->>
operador em vez de ->
para extrair text
, que pode ser convertido em integer
. Sua segunda tentativa adicionou um segundo erro:
t->'social'::int
Além do acima:precedência do operador . O operador de conversão
::
vincula mais forte que o operador json ->
. Como você já se encontrou, você realmente quer:(t->>'social')::int
Caso muito semelhante no dba.SE: