Запрос PostgreSQL, включающий целое число [] - PullRequest
2 голосов
/ 21 января 2011

У меня есть 2 таблицы:

CREATE TABLE article (  
  id serial NOT NULL,
  title text,
  tags integer[] -- array of tag id's from TAG table
)

CREATE TABLE tag (
  id serial NOT NULL,
  description character varying(250) NOT NULL
)

... и нужно выбрать теги из таблицы TAG, содержащейся в ARTICLE 'tags integer []' на основе заголовка статьи.

Так попробовал что-то вроде

SELECT *  
  FROM tag 
 WHERE tag.id IN ( (select article.tags::int4 
                      from article 
                     where article.title = 'some title' ) );

... что дает мне

ОШИБКА: невозможно привести тип целого числа [] к целому числу
ЛИНИЯ 1: ... ОТ тега ГДЕ tag.id IN ((выберите article.tags :: int4 из ...

Я застрял с PostgreSql 8.3 как в рабочей среде, так и в рабочей среде.

Ответы [ 3 ]

4 голосов
/ 22 января 2011

Используйте оператор перекрытия массивов &&:

SELECT *
    FROM tag
    WHERE ARRAY[id] && ANY (SELECT tags FROM article WHERE title = '...');

Используя contrib/intarray, вы даже можете достаточно хорошо индексировать подобные вещи.

4 голосов
/ 21 января 2011

Посмотрите на раздел " 8.14.5. Поиск в массивах ", но обратите внимание на подсказку в конце этого раздела:

Совет : Массивы не являются наборами;поиск определенных элементов массива может быть признаком неправильного проектирования базы данных.Попробуйте использовать отдельную таблицу со строкой для каждого элемента, который будет элементом массива.Это будет легче для поиска, и, вероятно, лучше масштабируется для большого количества элементов.

2 голосов
/ 21 января 2011

Вы не упомянули свою версию Postgres, поэтому я предполагаю, что вы используете последнюю версию (8.4, 9.0)

Это должно сработать тогда:

SELECT *  
  FROM tag 
 WHERE tag.id IN ( select unnest(tags)
                     from article 
                    where title = 'some title' );

Новам действительно стоит подумать об изменении дизайна таблицы.

Редактировать

Для 8.3 можно легко добавить функцию unnest (), см. эту вики-страницу:http://wiki.postgresql.org/wiki/Array_Unnest

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