我有occasion
和relation
个表格。 relation.occasions
是一个json类型字段,包含一系列场合键。我想按关系获取occasion
条记录,其中occasion.key
位于relation.occasions
。假设这是我的数据库数据:
场合
key | name |
-------------------------------------
BIRTHDAY | Birthday |
ANNIVERSARY | Anniversary |
关系
key | occasions |
------------------------------------------------------
FATHER | [ "BIRTHDAY", "ANNIVERSARY" ] |
FRIEND | [ "BIRTHDAY" ] |
以下是我尝试使用的查询:
SELECT * FROM occasion o WHERE o.key IN
(SELECT json_array_elements(r.occasions)::text from relation r WHERE r.key = 'FATHER')
结果是0行而不是预期2.有人可以给我一个暗示我做错了什么?我怎么能达到预期的效果?
答案 0 :(得分:3)
函数json_array_elements()
返回一个集合,而不是数组,因此您应该将它用作行源,而不是在选择列表中。
正确的查询是:
SELECT o.*
FROM occasion o
JOIN (
SELECT DISTINCT j.value
FROM relation
JOIN LATERAL json_array_elements_text(occasions) j(value) ON true
WHERE key = 'FATHER') sub ON o.key = sub.value;
你也可以在没有子查询的情况下将其展平,但我觉得这个版本更具可读性(无论如何,查询规划器都会进行展平)。