Есть ли способ фильтровать и массивировать столбец по серверу ie? Проще объяснить на примере. Представьте, что у меня есть эти данные:
table: data
id tag
1 {a,b,c,d}
2 {a,c,d,b}
3 {c,d,a,b}
4 {d,c,b,a}
5 {d,a,b,c}
6 {d,a,c,b}
Теперь я хочу получить все строки, в которых есть ["a", "b"] в этом порядке, и между ними нет элементов:
SELECT id from data where tags ???? ["a", "b"]
Этот запрос должен вернуть: 1,3,5
ОБНОВЛЕНИЕ 1: после просмотра array_position
и array_positionS
: https://www.postgresql.org/docs/10/functions-array.html
Я написал этот запрос:
select id
from data
where 'a' = ANY(tags)
and 'b' = ANY(tags)
and (array_position(tags, 'a') + 1) = any(array_positions(tags, 'b' ))
, который работает как ожидалось
ОБНОВЛЕНИЕ 2:
Как комментарий @klin, это приведет к неверному результату, если 'a' может появляться несколько раз, например {a,a,b,c,d}
. Так что это более общий c ответ
select *
from data
where 'a' = any(tags)
and 'b' = any(tags)
and (
array_position(tags, 'a') + 1 = any(array_positions(tags, 'b' ))
or array_position(tags, 'b') - 1 = any(array_positions(tags, 'a' )))