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: