如何在PostgreSQL中逐行存储逗号分隔的值

时间:2019-01-04 13:16:45

标签: sql json postgresql

输入:

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

我想这样插入到我的表中:

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

2 个答案:

答案 0 :(得分:1)

使用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)    

答案 1 :(得分:0)

使用 array (JSON数组)开始会更简单。您可以使用json_array_elements_text(json)。参见:

将{strong> 您拥有的列表 转换为包含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);

db <>提琴here

我建议在unnest()列表中使用SELECT的简单形式的Postgres 10或更高版本。参见:

我避免将regexp函数用于简单任务。这些功能强大,但价格昂贵得多。