ANY / ALL (массив) не поддерживает заданные аргументы - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть столбец jsonb, в котором есть информация о рекламных акциях.

Я бы хотел отфильтровать ключи так, чтобы они находились в предопределенном списке.

Я применил то, что было для меня интуитивно, where code in ('foo', 'bar'), но это вызывает ошибку: ANY/ALL (array) does not support set arguments

Есть идеи?

Запрос:

select
    upper(jsonb_object_keys(orders.extra_details -> 'promotion_codes')) as promo_code,
    count(tickets.id)
from 
    tickets
    inner join order_items on order_items.orderable_id = tickets.id
    inner join orders on orders.id = order_items.order_id
where 
    order_items.type = 'TicketOrderItem'
    and orders.extra_details -> 'promotion_codes' is not null
    and tickets.event_id = 4062
    and tickets.status = 2
    and upper(jsonb_object_keys(orders.extra_details -> 'promotion_codes')) in ('FOO', 'BAR', 'BAZ')
group by 
    1
order by 
    1

1 Ответ

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

jsonb_object_keys возвращает набор значений.Вы не должны использовать это в списке select, и вы не можете использовать его в предложении where.

Это похоже на использование выражения, подобного следующему: where (select some_column from some_table) in ('a','b')

Правильный способ его использования - присоединить запрос к результату jsonb_object_keys

select upper(ed.promo_code) as promo_code,
       count(tickets.id)
from tickets
  join order_items on order_items.orderable_id = tickets.id
  join orders on orders.id = order_items.order_id
  join lateral jsonb_object_keys(orders.extra_details -> 'promotion_codes') as ed(promo_code) on true
where 
    order_items.type = 'TicketOrderItem'
    and orders.extra_details -> 'promotion_codes' is not null
    and tickets.event_id = 4062
    and tickets.status = 2
    and upper(ed.promo_code) in ('FOO', 'BAR', 'BAZ')
group by 
    1
order by 
    1
...