【问题标题】:convert JSON array to PostgreSQL array for use in a join将 JSON 数组转换为 PostgreSQL 数组以用于连接
【发布时间】:2019-04-29 08:58:30
【问题描述】:

我使用的是 Postgres 9.6,我有以下两个表:

create table employees (
  id text,
  setting_id text -- references settings.id
);

create table settings (
  id text,
  setting_str text -- contains json string
);

insert into employees (id, setting_id) values ('e1', 's1');
insert into employees (id, setting_id) values ('e2', 's2');

insert into settings (id, setting_str)
   values ('s1', '{"vehicles" : null}');
insert into settings (id, setting_str)
   values ('s2', '{"vehicles" : ["Car", "Bike"]}');

现在我想得到如下输出:

employee_id, name, vehicles
e1, one, null
e2, two, {"Car", "Bike"}

我尝试了以下查询:

select e.id,
       jsonb_array_elements_text(s.setting_str::jsonb #> '{vehicles}')
from employees e
   join settings s on s.id = e.setting_id;

但它给了我一个错误:

ERROR:  cannot extract elements from a scalar

知道如何从文本字段中提取 JSON 数组并在 select 语句中将其显示为 Postgres 字符串数组(不是 json 数组,不是 text)吗?

【问题讨论】:

    标签: arrays json postgresql join


    【解决方案1】:

    数据模型不好,查询会很复杂。

    您应该对此类数据使用关系模型。

    这是带有内联 cmets 的查询:

    SELECT e.id AS employee_id,
           s.id AS setting_id,
           /* construct an array of all vehicles that are not NULL */
           array_agg(v.p) FILTER (WHERE v.p IS NOT NULL) AS vehicles
    FROM employees AS e
       JOIN settings AS s ON e.setting_id = s.id
       /* join with the "exploded" JSON array from s.setting_str */
       LEFT JOIN LATERAL json_array_elements_text(
                            /* replace "null" with an empty array */
                            COALESCE(
                               (s.setting_str::json) ->> 'vehicles',
                               '[]'
                            )::json
                         ) AS v(p) ON TRUE
    GROUP BY e.id, s.id;
    
     employee_id | setting_id |  vehicles  
    -------------+------------+------------
     e1          | s1         | 
     e2          | s2         | {Car,Bike}
    (2 rows)
    

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 2011-03-05
      • 2019-05-09
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多