我确信这是一个重复的问题,答案就在某个地方,但我在谷歌上搜索了10分钟后还没有找到答案,所以我呼吁编辑不要关闭它,因为它可能对其他人有用。

我使用的是Postgres 9.5。这是我的桌子:

        Column          │           Type            │                                Modifiers
─────────────────────────┼───────────────────────────┼─────────────────────────────────────────────────────────────────────────
 id                      │ integer                   │ not null default nextval('mytable_id_seq'::regclass)
 pmid                    │ character varying(200)    │
 pub_types               │ character varying(2000)[] │ not null

我想在pub_types中找到所有带有“Journal”的行。

我找到了相关的文档,用谷歌搜索了一下,这就是我的尝试:

select * from mytable where ("Journal") IN pub_types;
select * from mytable where "Journal" IN pub_types;
select * from mytable where pub_types=ANY("Journal");
select * from mytable where pub_types IN ("Journal");
select * from mytable where where pub_types contains "Journal";

我已经扫描了postgres数组文档,但不能看到一个简单的例子,如何运行查询,和StackOverflow的问题似乎都是基于更复杂的例子。


这应该可以工作:

select * from mytable where 'Journal'=ANY(pub_types);

例如,语法是<value> = ANY (<array>)。还要注意,postresql中的字符串文字是用单引号编写的。


虽然这可能不是最有效的方法,但对我来说很有效:

select * from mytable
where array_to_string(pub_types, ',') like '%Journal%'

然而,使用contains操作符@>(参见上面Sudharsan Thumatti的回答)可能是一个性能更好的选择,但我没有做任何基准测试。

根据您的规范化需求,最好实现一个带有FK引用的单独表,因为这样可以获得更好的性能和可管理性。


使用ANY操作符只能搜索一个值。

例如,

SELECT * FROM mytable WHERE 'Book' = ANY(pub_types);

如果你想搜索一个包含多个值的数组,你可以使用@>操作符。

例如,

SELECT * FROM mytable WHERE pub_types @> '{"Journal", "Book"}';

如果要搜索包含某些值之一的数组,可以使用&&操作符。

例如,

SELECT * FROM mytable WHERE pub_types && '{"Journal", "Book"}';

您可以按照自己喜欢的顺序指定。


我们可以使用ANY代替IN,将数组强制转换为enum数组,例如:

create type example_enum as enum (
  'ENUM1', 'ENUM2'
);

create table example_table (
  id integer,
  enum_field example_enum
);

select 
  * 
from 
  example_table t
where
  t.enum_field = any(array['ENUM1', 'ENUM2']::example_enum[]);

或者我们仍然可以使用'IN'子句,但首先,我们应该'unnest'它:

select 
  * 
from 
  example_table t
where
  t.enum_field in (select unnest(array['ENUM1', 'ENUM2']::example_enum[]));

例如:https://www.db-fiddle.com/f/LaUNi42HVuL2WufxQyEiC/0