涉及整数[]的PostgreSQL查询

发布于 2024-10-13 09:55:09 字数 704 浏览 2 评论 0原文

我有 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
)

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

所以尝试了类似

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

...这给了我

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

我在开发和生产环境中都陷入了 PostgreSql 8.3 的困境。

I have 2 tables:

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
)

... and need to select tags from TAG table held in ARTICLE's 'tags integer[]' based on article's title.

So tried something like

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

... which gives me

ERROR: cannot cast type integer[] to integer
LINE 1: ...FROM tag WHERE tag.id IN ( (select article.tags::int4 from ...

I am Stuck with PostgreSql 8.3 in both dev and production environment.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

冷情妓 2024-10-20 09:55:09

使用数组重叠运算符&&

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

使用contrib/intarray,您甚至可以很好地索引此类内容。

Use the array overlaps operator &&:

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

Using contrib/intarray you can even index this sort of thing quite well.

风柔一江水 2024-10-20 09:55:09

看一下“8.14.5. 在数组中搜索”,但请考虑该部分末尾的提示:

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

Take a look at section "8.14.5. Searching in Arrays", but consider the tip at the end of that section:

Tip: Arrays are not sets; searching for specific array elements can be a sign of database misdesign. Consider using a separate table with a row for each item that would be an array element. This will be easier to search, and is likely to scale better for a large number of elements.

完美的未来在梦里 2024-10-20 09:55:09

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

这应该可以工作:

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

但是你真的应该考虑改变你的表设计。

编辑

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

You did not mention your Postgres version, so I assume you are using an up-to-date version (8.4, 9.0)

This should work then:

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

But you should really consider changing your table design.

Edit

For 8.3 the unnest() function can easily be added, see this wiki page:
http://wiki.postgresql.org/wiki/Array_Unnest

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文