org.postgresql.util.PSQLException: ОШИБКА: функции, возвращающие множество, не разрешены в WHERE - PullRequest
0 голосов
/ 14 ноября 2018

Мне нужна помощь для перечисленных ниже деталей,

Я использую 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? Особенно в моем случае у меня есть внутренний список и несколько элементов внутри.

1 Ответ

0 голосов
/ 14 ноября 2018

Я рекомендую боковое соединение с 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 s, где связанный JSON содержит элемент массива с action = PENDING, вы можете сделать запрос следующим образом:

SELECT DISTINCT id
FROM tale1 CROSS JOIN LATERAL
     jsonb_array_elements(initiated_referral_detail -> 'listOfAttribue') AS attr
WHERE attr ->> 'action' = 'PENDING';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...