Использование предложения where в комбинации с подзапросом, результатом которого является запись, содержащаяся в массиве - PullRequest
0 голосов
/ 07 апреля 2019

Я нашел некоторые результаты / ответы, касающиеся поиска в массиве, но:

  1. WHERE = ANY, работает со столбцом, но не с subquery, который возвращает в результате одну запись, содержащую массив, вызывает ошибку
  2. WHERE IN, также вызывает ту же ошибку
  3. Я также протестировал untest в подзапросе, ошибка, аналогичная первой 2
  4. Я не хочу проверять, есть ли значение в массиве, но получить / выполнить запрос значений в массиве, как WHERE IN (1,2,3,4), а не как в других вопросах / ответах

Ошибка:

Ни один оператор не соответствует данному имени и типу аргумента. Вам может понадобиться добавить явное приведение типов.

или

Оператор не соответствует int = int []

путь - это int[] тип массива.

Состав:

id | name |  | slug   | path | parent_id
1    name1     slug1     {1}      null
2    name2     slug2    {1,2}     1
3    name3     slug3   {1,2,3}    2
4    nam4      slug4   {4}       null

Что я пытаюсь использовать в качестве базы:

SELECT t.id, t.name, t.slug FROM types AS t
WHERE t.id in (SELECT t.path FROM types AS t WHERE t.id = 24)
ORDER BY depth ASC

В основном путь похож на breadcrumb, {grandparent,parent,type}

1 Ответ

1 голос
/ 07 апреля 2019

Вот один, использующий IN и unnest()

SELECT t1.id,
       t1."name",
       t1.slug
       FROM types t1
       WHERE t1.id IN (SELECT un.e
                              FROM types t2
                                   CROSS JOIN LATERAL unnest(t2.path) un (e)
                              WHERE t2.id = 2)
       ORDER BY array_length(t1.path, 1);

И еще один, использующий массив, содержится в операторе <@.

SELECT t1.id,
       t1."name",
       t1.slug
       FROM types t1
       WHERE ARRAY[t1.id] <@ (SELECT t2.path
                                     FROM types t2
                                          WHERE t2.id = 2)
       ORDER BY array_length(t1.path, 1);

И один, использующий = ANY.

SELECT t1.id,
       t1."name",
       t1.slug
       FROM types t1
       WHERE t1.id = ANY ((SELECT t2.path
                                  FROM types t2
                                  WHERE t2.id = 2)::integer[])
       ORDER BY array_length(t1.path, 1);

db <> fiddle

Вы не включили depth в свои данные выборки, поэтому я заменил его на array_length(t1.path, 1), что, вероятно,что это такое.

...