如何使用PostgreSQL json_array_elements whit WHERE <value> IN子句

时间:2016-07-02 11:35:52

标签: json postgresql

我有occasionrelation个表格。 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.有人可以给我一个暗示我做错了什么?我怎么能达到预期的效果?

1 个答案:

答案 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;

你也可以在没有子查询的情况下将其展平,但我觉得这个版本更具可读性(无论如何,查询规划器都会进行展平)。