Postgres:检查数组字段是否包含值?

时间:2016-09-22 15:45:01

标签: postgresql

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

我使用的是Postgres 9.5。这是我的表:

bound

我想用" Journal"找到所有行。在 Column │ Type │ Modifiers ─────────────────────────┼───────────────────────────┼───────────────────────────────────────────────────────────────────────── id │ integer │ not null default nextval('mytable_id_seq'::regclass) pmid │ character varying(200) │ pub_types │ character varying(2000)[] │ not null

我已经找到了文档和Google搜索,这就是我尝试过的:

pub_types

我已经扫描过the postgres array docs,但无法看到如何运行查询的简单示例,而StackOverflow问题似乎都是基于更复杂的示例。

5 个答案:

答案 0 :(得分:34)

这应该有效:

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

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

答案 1 :(得分:5)

使用 ANY 运算符,您只能搜索一个值。

如果要搜索多个值,可以使用 @> 运算符。

例如,

select * from mytable where pub_types @> '{"Journal", "Book"}';

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

答案 2 :(得分:1)

我不得不相信这是非常低效的,并且为什么不在列中实现数组的一个很好的例子,一个带有FK引用的单独表将会表现得更好,并且更灵活,更易于管理。 / p>

但无论如何,这对我有用:

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

答案 3 :(得分:1)

我们可以使用IN而不是ANY来将数组强制转换为枚举数组,例如:

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'子句,但是首先,我们应该'取消嵌套':

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

答案 4 :(得分:0)

这对我有用

let exampleArray = [1, 2, 3, 4, 5];
let exampleToString = exampleArray.toString(); //convert to toString
let query = `Select * from table_name where column_name in (${exampleToString})`; //Execute the query to get response

我遇到了同样的问题,然后经过一个小时的努力,我才知道不应在查询中直接访问该数组。因此,然后我发现数据应该在自身的括号内发送,然后再次使用js中的toString方法将该数组转换为字符串。所以我通过执行上面的查询来工作,并得到了预期的结果