Една единствена SQL команда, базирана на набор, е много по-ефективна от цикъла:
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?
За да отговорите на първоначалния си въпрос:
Защото се опитвахте да конвертирате jsonb
стойност на integer
. Във вашето решение вече сте открили, че имате нужда от ->>
оператор вместо ->
за извличане на text
, което може да бъде преобразувано в integer
.
Вашият втори опит добави втора грешка:
t->'social'::int
В допълнение към горното:предимство на оператора . Операторът за прехвърляне ::
се свързва по-силно от json оператора ->
. Както вече сте се открили, наистина искате:
(t->>'social')::int
Много подобен случай на dba.SE: