我有两个桌子。
表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);
答案 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 demo,weird 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';