Как преобразовать элементы массива из строки в Int в Postgres? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть столбец в таблице как jsonb [14,21,31], и я хочу получить все строки с выбранным элементом, например,

SELECT * 
FROM t_customers 
WHERE tags ?| array['21','14']

, но элементы jsonb имеют целочисленный формат. Как мне преобразовать sqlэлементы массива в целое число, я попытался удалить кавычки из массива, но это дает ошибку

1 Ответ

0 голосов
/ 23 мая 2018

Наивным решением будет:

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 с текстовыми представлениями целых чисел

...