Postgresql: массив фильтров по серии - PullRequest
1 голос
/ 06 февраля 2020

Есть ли способ фильтровать и массивировать столбец по серверу 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' )))

1 Ответ

1 голос
/ 06 февраля 2020

Вы можете использовать регулярное выражение в текстовом представлении массивов.

select *
from my_table
where tag::text ~ '[\{,]a,b[,\}]'

Db <> Fiddle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...