PostgreSQL查询涉及整数[]

时间:2011-01-21 16:22:48

标签: sql postgresql

我有两张桌子:

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
)

...并且需要根据文章的标题从ARTICLE的'tags integer []'中选择TAG表中的标签。

尝试了类似

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

......这给了我

  

错误:无法将整数[]类型转换为整数
  第1行:... FROM标签WHERE tag.id IN((从...中选择article.tags :: int4

我在开发和生产环境中都坚持使用PostgreSql 8.3。

3 个答案:

答案 0 :(得分:4)

请查看“8.14.5. Searching in Arrays”部分,但请考虑该部分末尾的提示:

  

提示:数组不是集合;搜索特定的数组元素可能是数据库错误设计的标志。考虑为每个将成为数组元素的项使用一个单独的表。这将更容易搜索,并且可能更好地扩展到大量元素。

答案 1 :(得分:4)

使用数组重叠运算符&&

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

使用contrib/intarray你甚至可以很好地索引这类东西。

答案 2 :(得分:2)

你没有提到你的Postgres版本,所以我假设你使用的是最新版本(8.4,9.0)

这应该适用:

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

但你应该考虑改变你的桌面设计。

修改

对于8.3,可以轻松添加unexst()函数,请参阅此Wiki页面:
http://wiki.postgresql.org/wiki/Array_Unnest