powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SQL запрос с массивами
5 сообщений из 5, страница 1 из 1
SQL запрос с массивами
    #39826899
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую СУБД postgresql. Помогите написать запрос.
Есть 3 массива со значениями 3 полей таблицы A[a1,a2], B[b1,b2], C[c1,c2] соответственно.
Есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT *
FROM T
WHERE Field1 = a1 AND Field2 = b1 AND Field3 = c1
UNION
SELECT *
FROM T
WHERE Field1 = a2 AND Field2 = b2 AND Field3 = c2



То есть нужно найти все записи, значения полей которых равны наборам из массива (a[N],b[N],c[N]).
Если массивы большие размером, не хочется лепить запрос через UNION, он выполняется долго и
размер этого запроса большой.
Может быть можно сократить, что-то типа такого
Код: sql
1.
2.
3.
SELECT *
FROM T
WHERE Field1 = ANY(ARRAY[a1,a2,a3]) AND Field2 = ANY(ARRAY[b1,b2,b3]) AND Field3 = ANY(ARRAY[c1,c2,c3])


Но в таком виде запрос работает неверно, возвращает записи в полях которых входит хотя бы одно значение массива
из каждого массива.
...
Рейтинг: 0 / 0
SQL запрос с массивами
    #39827012
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11Использую СУБД postgresql. Помогите написать запрос.
Есть 3 массива со значениями 3 полей таблицы A[a1,a2], B[b1,b2], C[c1,c2] соответственно.
Есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT *
FROM T
WHERE Field1 = a1 AND Field2 = b1 AND Field3 = c1
UNION
SELECT *
FROM T
WHERE Field1 = a2 AND Field2 = b2 AND Field3 = c2



То есть нужно найти все записи, значения полей которых равны наборам из массива (a[N],b[N],c[N]).
Если массивы большие размером, не хочется лепить запрос через UNION, он выполняется долго и
размер этого запроса большой.
Может быть можно сократить, что-то типа такого
Код: sql
1.
2.
3.
SELECT *
FROM T
WHERE Field1 = ANY(ARRAY[a1,a2,a3]) AND Field2 = ANY(ARRAY[b1,b2,b3]) AND Field3 = ANY(ARRAY[c1,c2,c3])


Но в таком виде запрос работает неверно, возвращает записи в полях которых входит хотя бы одно значение массива
из каждого массива.

Опять используя багофичу из предыдушего треда задача решается следующим образом
Код: plsql
1.
2.
select T.* FROM T
JOIN (SELECT unnest(ARRAY[a1,a2,a3]) as f1, unnest(ARRAY[b1,b2,b3]) as f2, unnest(ARRAY[c1,c2,c3]) as f3) AS _t ON Field1=_t.f1 AND Field2=_t.f2 AND Field3=_t.f3
...
Рейтинг: 0 / 0
SQL запрос с массивами
    #39827029
ARTURV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

Обратите внимание на операции с массивами @> и <@
...
Рейтинг: 0 / 0
SQL запрос с массивами
    #39827061
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk
Опять используя багофичу из предыдушего треда задача решается следующим образом
Код: plsql
1.
2.
select T.* FROM T
JOIN (SELECT unnest(ARRAY[a1,a2,a3]) as f1, unnest(ARRAY[b1,b2,b3]) as f2, unnest(ARRAY[c1,c2,c3]) as f3) AS _t ON Field1=_t.f1 AND Field2=_t.f2 AND Field3=_t.f3



кто-то давно в доку не заглядывал https://www.postgresql.org/docs/10/functions-array.html
Код: sql
1.
unnest(anyarray, anyarray [, ...]) 	setof anyelement, anyelement [, ...]



т.е.
Код: plsql
1.
2.
select T.* FROM T
where (A,B,C) IN (SELECT * from  unnest(ARRAY[a1,a2,a3], ARRAY[b1,b2,b3],ARRAY[c1,c2,c3])  as u(a,b,c))

[/quot]
или
Код: sql
1.
2.
select T.* FROM T
JOIN (SELECT distinct * from   unnest(ARRAY[a1,a2,a3], ARRAY[b1,b2,b3],ARRAY[c1,c2,c3]) as u(a,b,c) )  u USING (a,b,c) 
...
Рейтинг: 0 / 0
SQL запрос с массивами
    #39827107
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqMaxim BogukОпять используя багофичу из предыдушего треда задача решается следующим образом
Код: plsql
1.
2.
select T.* FROM T
JOIN (SELECT unnest(ARRAY[a1,a2,a3]) as f1, unnest(ARRAY[b1,b2,b3]) as f2, unnest(ARRAY[c1,c2,c3]) as f3) AS _t ON Field1=_t.f1 AND Field2=_t.f2 AND Field3=_t.f3



кто-то давно в доку не заглядывал https://www.postgresql.org/docs/10/functions-array.html
Код: sql
1.
unnest(anyarray, anyarray [, ...]) 	setof anyelement, anyelement [, ...]




Таки да - давно.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SQL запрос с массивами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]