Как хранить значения, разделенные запятыми, построчно в postgresql - PullRequest
0 голосов
/ 04 января 2019

Введите:

('{"user":{"status":1,"loginid":1,"userids":{"userid":"5,6"}}}')  

Я хочу вставить в свой стол вот так:

userid    loginid    status  
---------------------------
5            1         1      
6            1         1

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Было бы проще с массивом (массив JSON) для начала. Вы можете использовать json_array_elements_text(json). См:

Преобразование имеющегося у вас списка в массив с string_to_array(). Тогда unnest().

SELECT unnest(string_to_array(js#>>'{user,userids,userid}', ',')) AS userid
     , (js#>>'{user,loginid}')::int AS loginid
     , (js#>>'{user,status}')::int  AS status
FROM  (
   SELECT json '{"user":{"status":1,"loginid":1,"userids":{"userid":"5,6"}}}'
   ) i(js);

дБ <> скрипка здесь

Я советую Postgres 10 или более поздней версии для простой формы с unnest() в списке SELECT. См:

Я избегаю функций регулярных выражений для простых задач. Они мощные, но существенно дороже.

0 голосов
/ 04 января 2019

Использовать regexp_split_to_table(). Предполагая, что столбцы являются целыми числами:

with input_data(data) as (
values
    ('{"user":{"status":1,"loginid":1,"userids":{"userid":"5,6"}}}'::json)
)

-- insert into my_table(userid, loginid, status)
select 
    regexp_split_to_table(data->'user'->'userids'->>'userid', ',')::int as userid,
    (data->'user'->>'loginid')::int as loginid,
    (data->'user'->>'status')::int as status
from input_data

 userid | loginid | status 
--------+---------+--------
      5 |       1 |      1
      6 |       1 |      1
(2 rows)    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...