我确信这是一个重复的问题,答案就在某个地方,但我在谷歌上搜索了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的问题似乎都是基于更复杂的例子。
我们可以使用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
我们可以使用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
使用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"}';
您可以按照自己喜欢的顺序指定。