... ГДЕ ['ID_two','ID_four'] COINTAINS_AT_LEAST_ONE_ID_FROM ['ID_one','ID_two','ID_three']
Я хотел бы иметь SQL-запрос, в котором я проверяю, соответствует ли один идентификатор (массива с идентификаторами) хотя бы одному идентификатору из массива других идентификаторов. Идентификаторы — это укусы.
Это должно быть так:
SELECT * FROM table1 WHERE table1.ids COINTAINS_AT_LEAST_ONE_ID_FROM ['ID_one','ID_two','ID_three']
table1.ids также содержит массив с идентификаторами. Например, скажем ['ID_two','ID_four']
Я видел несколько решений, но я использую старую версию PostgreSQL (8.0.2 на Redshift), и пока ничего не помогло.
Знаете ли вы решение? :)
Привет
1 ответ
Вот уродливое решение (если вы в отчаянии), оно должно работать на 8.0:
Сначала создайте таблицу t10, которую вы будете использовать в качестве итератора (настройте ее на максимальный размер массива):
CREATE TABLE T10 (ID INTEGER);
INSERT INTO T10 VALUES (1);
INSERT INTO T10 VALUES (2);
INSERT INTO T10 VALUES (3);
INSERT INTO T10 VALUES (4);
INSERT INTO T10 VALUES (5);
INSERT INTO T10 VALUES (6);
INSERT INTO T10 VALUES (7);
INSERT INTO T10 VALUES (8);
INSERT INTO T10 VALUES (9);
INSERT INTO T10 VALUES (10);
Тогда вот тестовая таблица:
create table table1 (
ids text[]
);
insert into table1 (ids) values (ARRAY['ID_two','ID_four']);
select * from table1;
ids
------------------
{ID_two,ID_four}
Затем запрос, который использует T10 для перебора всех членов ваших массивов:
\set myids ARRAY['''ID_one''','''ID_two''','''ID_three''']
select *
from (
select ids[iter.pos] as ids
from table1
join (select id as pos from t10) iter
on iter.pos <= array_length(ids,1)) as A
join (
select (:myids)[iter.pos] as ids
from (select id as pos from t10) iter
where iter.pos <= array_length(:myids,1)) as B
on a.ids = b.ids;
ids | ids
--------+--------
ID_two | ID_two