... ГДЕ ['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
Другие вопросы по тегам