org.postgresql.util.PSQLException:错误:WHERE中不允许使用返回集合的函数

时间:2018-11-14 03:36:46

标签: postgresql spring-boot spring-data-jpa spring-data jsonb

我需要以下详细信息的帮助,

我正在使用Postgres + Spring-Data-JPA。此外,我使用了jsonb数据类型来存储数据。

我正在尝试执行查询,但是它给我以下错误:

ERROR: set-returning functions are not allowed in WHERE

这里的原因是我在jsonb子句中添加了WHERE条件(有关更多详细信息,请参阅下面的查询)。

查询(我是因为隐藏了实际的列名而重命名了列名):

select distinct
    jsonb_array_elements(initiated_referral_detail->'listOfAttribue')::jsonb
        ->>  'firstName' as firstName,
    jsonb_array_elements(initiated_referral_detail->'listOfAttribue')::jsonb
        ->>  'lastName' as lastName,
    jsonb_array_elements(initiated_referral_detail->'listOfAttribue')::jsonb
        ->>   'country' as country  
from
    tale1 table10_ 
left outer join
    table2 table21_ 
        on table10_.end_user_id=table21_.end_user_id 
left outer join
    table3 table32_ 
        on table10_.manufacturer_id=table32_.manufacturer_id  
where
    table21_.end_user_uuid=(
        ?
    ) 
    and table21_.is_active=true 
    and table32_.manufacturer_uuid=(
        ?
    ) 
    and table32_.is_active=true 
    and table10_.is_active=true 
    and table32_.is_active=true 
    and jsonb_array_elements(initiated_referral_detail->'listOfAttribue')::jsonb
        ->>  'action' = ('PENDING') 
order by
    jsonb_array_elements(initiated_referral_detail->'listOfAttribue')::jsonb
        ->>  'firstName',
    jsonb_array_elements(initiated_referral_detail->'listOfAttribue')::jsonb
        ->>  'lastName'
limit ?

上述查询中的以下行引起了错误:

and jsonb_array_elements(initiated_referral_detail->'listOfAttribue')::jsonb
    ->> 'action' = ('PENDING')

任何人都可以指导我如何从内部JSON获取数据吗?特别是在我的情况下,我有一个内部List和里面的一些元素。

1 个答案:

答案 0 :(得分:0)

对于这种情况,我建议与jsonb_array_elements进行横向联接。这是一个示例:

CREATE TABLE tale1 (
   id integer PRIMARY KEY,
   initiated_referral_detail jsonb NOT NULL
);

INSERT INTO tale1 VALUES
   (1, '{
          "name": "one",
          "listOfAttribue": [
                              { "id": 1, "action": "DONE"},
                              { "id": 2, "action": "PENDING" },
                              { "id": 3, "action": "ACTIVE" }
                            ]
        }');

INSERT INTO tale1 VALUES
   (2, '{
          "name": "two",
          "listOfAttribue": [
                              { "id": 1, "action": "DONE"},
                              { "id": 2, "action": "ACTIVE" }
                            ]
        }');

要查找所有id,其中关联的JSON包含action = PENDING的数组元素,可以这样查询:

SELECT DISTINCT id
FROM tale1 CROSS JOIN LATERAL
     jsonb_array_elements(initiated_referral_detail -> 'listOfAttribue') AS attr
WHERE attr ->> 'action' = 'PENDING';