Наивным решением будет:
t=# with t_customers(tags) as (values('[14,21,31]'::jsonb))
select
tags
, translate(tags::text,'[]','{}')::int[] jsonb_int_to_arr
, translate(tags::text,'[]','{}')::int[] @> array['21','14']::int[] includes
from
t_customers;
tags | jsonb_int_to_arr | includes
--------------+------------------+----------
[14, 21, 31] | {14,21,31} | t
(1 row)
https://www.postgresql.org/docs/current/static/functions-array.html, если вы хотите привести к массиву - вы должны использовать оператор @>
, чтобы проверить, содержит ли он.
(сначала я предложил его, потому что я неправильно понял вопрос - поэтому он идет противоположным путем, «превращая» jsonb в массив и проверяя, содержит ли он, но теперь, возможно, этот наивный подход самый короткий)
правильный подходздесь, вероятно, будет:
t=# with t_customers(tags) as (values('[14,21,31]'::jsonb))
, t as (select tags,jsonb_array_elements(tags) from t_customers)
select jsonb_agg(jsonb_array_elements::text) ?| array['21','14'] tags from t group by tags;
tags
------
t
(1 row)
, который в основном "переупаковывает" массив jsonb с текстовыми представлениями целых чисел