Я нашел некоторые результаты/ответы относительно поиска в массиве, но:
WHERE = ANY, работает со столбцом, но не с subquery, который возвращает одну запись, содержащую массив, в результате вызывает ошибкуuntest в подзапросе, ошибка аналогична первым 2WHERE IN (1,2,3,4), а не как в других вопросах/ответахОшибка:
No operator matches the given name and argument types. You might need to add explicit type casts.
или
No operator matches 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}





Вот один из них с использованием 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);
Вы не включили depth в свой пример данных, поэтому я заменил его на array_length(t1.path, 1), что, вероятно, и есть.
Во-первых, вы должны использовать разные ярлыки для основного запроса и подзапроса, использование t дважды, по крайней мере, трудно читать. Во-вторых, поскольку ЛЮБОЙ работает с столбцом, попробуйте записать его как внутреннее соединение.