Задать вопрос
@vhsporno

Как найти дубли в массивах postgres?

Есть столбец в постгре, который хранит в себе массив интежеров.
Например:
{1,2,3}
{4, 5}
{3, 6}
Нужно найти вот эти строку один и три где хотя бы один элемент повторяется. Подскажите пожалуйста как это реализовать?
  • Вопрос задан
  • 1230 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
@alexalexes
Если это можно декомпозировать до 3-ей нормальной формы базы данных, то лучше сделать это, иначе придется использовать костыль из 4 функций, чтобы выйти на значения в этих массивах и хоть как-то работать потом с ними в запросах.
select a.* from
(
  select b.id, b.split_value, count(b.id) over (partition by b.split_value) as v_count
  from
  (
    select c.id, cast(unnest(string_to_array(translate(c.value,'{}',''),',')) as INTEGER) as split_value
    from
    ( -- имитация данных таблицы
      (select 0 as id, '{1,2,3}' as value) union all
      (select 1, '{4, 5}') union all
      (select 2, '{3, 6}') 
    ) c
  ) b
) a
where a.v_count > 1

Решение Б (исходные данные - тип массив).
select a.* from
(
  select b.id, b.split_value, count(b.id) over (partition by b.split_value) as v_count
  from
  (
    select c.id, unnest(c.value) as split_value
    from
    ( -- имитация данных таблицы
      (select 0 as id, array[1,2,3] as value) union all
      (select 1, array[4,5]) union all
      (select 2, array[3,6]) 
    ) c
  ) b
) a
where a.v_count > 1
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Реляционная алгебра практически не умеет оперировать горизонтальными коллекциями. Такова она есть. И SQL создавался для других дел.

Самое правильное что можно сделать - создать временную табличку. Слить туда твои массивы с разворотом в 90 градусов и выполнить простейший (! реально простейший!) запрос с группировкой.

Это решение будет идеологически правильней, чем нагружать SQL не-свойственными ему задачами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы