如何根据表B中的json列从表A中选择行

时间:2019-10-05 13:38:20

标签: json postgresql

我有两个桌子。

表A的元数据带有一个字符串名称列和一个json列,其中存储了类似于以下内容的mac_id

   name    |   ids
---------------------------
  site1    | {"type1": ["id1", "id2"], "type2": ["id3", "id4"]}
  site2    | {"type1": ["id5", "id6"], "type3": ["id7", "id8"], "type4"...}
   ...     |  ...

表B仅具有ID和数据

   id  |   data
-----------------
   id1 | 1.23
   id2 | 3.45
  ...  | ...

我想创建一个查询,以根据表A中的站点名称和ID类型从表B中选择行。

例如,我想选择B中ID在site1(类型1)中的所有行。

假定我们只想从名称为site1的表A的最后一条记录中查找ID。

这是我尝试的不起作用的查询

SELECT * FROM table_b
WHERE id IN ( SELECT ids -> 'type1' 
               FROM table_a 
               WHERE name = 'site1' 
               LIMIT 1);

1 个答案:

答案 0 :(得分:1)

ids -> 'type1'产生一个JSON值,该值可能是一个数组,但不能与IN运算符一起使用。您首先要need to turn that into a Postgres array

SELECT * FROM table_b
WHERE id = ANY(ARRAY(
    SELECT el
    FROM table_a, LATERAL json_array_elements_text(ids -> 'type1') el
    WHERE name = 'site1'));

Online demoweird alternative

或者,您也可以尝试一些新颖的Postgres 12 json path functions

SELECT table_b.*
FROM table_b JOIN table_a ON jsonb_path_match(
                               ids::jsonb,
                               '$.type1[*] == $id',
                               jsonb_build_object('id', id))
WHERE name = 'site1';

Online demo