我有两张桌子:
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。
答案 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