LINUX.ORG.RU

JSONB преобразовать значения из строк в числа

 ,


0

1

Использую PGSQL 16.

Есть таблица

CREATE TABLE product (
  id INT,
  details JSONB
);


INSERT INTO product VALUES (1, '{"CPU":"4", "RAM":"16", "HDD":"2"}');
INSERT INTO product VALUES (2, '{"CPU":"3", "RAM":"8", "HDD":"1"}');


id |                details                
----+---------------------------------------
  1 | {"CPU": "4", "HDD": "2", "RAM": "16"}
  2 | {"CPU": "3", "HDD": "1", "RAM": "8"}

Значения в JSONB - строки, нужно преобразовать в числа. Чтобы получились такие данные:

id |             details             
----+---------------------------------
  1 | {"CPU": 4, "HDD": 2, "RAM": 16}
  2 | {"CPU": 3, "HDD": 1, "RAM": 8}

Написал работающий запрос:

with t as(
   select 
      
       (select array_agg(replace(replace(v::text, '"', ''), '\', '')::int order by k) 
	   from jsonb_each(details) as t(k,v)) as col22,
     
	   (select array_agg(k order by k)  
	   from jsonb_each(details) as t(k,v)) as col11,
      
	   id
     
   from product
),
a as(
   select  
      (
	    select jsonb_object_agg(col1, col2)
        from (
             select unnest(col11) as col1, unnest(col22) as col2
			 ) t
	   ) AS itog,
       id
    from t
)
update product
set details = itog
from a 
where product.id = a.id
returning product.*

В запросе приходится редактировать строки (удалять кавычки), возможно есть проще способ через CAST перевести строки в числа?