Postgresql IN错误:运算符不存在整数=整数[]

时间:2018-06-11 17:12:35

标签: postgresql

Nestjs / Express中的WHERE ANY查询工作正常:

const sql = 'SELECT * FROM members WHERE '+ integerId + ' = ANY(skill_id_array)';
const membersBySkill = await this.entityManager.query(sql

);

此WHERE IN查询失败,并显示此帖子的标题错误消息:

const sql = 'SELECT * FROM members WHERE '+ integerId + ' IN (skill_id_array)';
const membersBySkill = await this.entityManager.query(sql);

我对SQL的理解是IN,ANY应该是几乎相同的查询,结果几乎相同。

integerId is a var integer such as 2.
skill_id_array in Postgres looks like this: {1,2,5}

为什么会发生这种错误?我在整数数组列中搜索整数。

1 个答案:

答案 0 :(得分:4)

简而言之:in()需要一个标量列表,而any()需要一个数组表达式。

the documentation:

  

表达式IN(值[,...])

     

右侧是带括号的标量表达式列表。

示例:

where integerid in (1, 2, 5)
  

表达式运算符ANY(数组表达式)

     

右侧是带括号的表达式,它必须产生一个数组值。

示例:

where integerid = any ('{1, 2, 5}');

由于

  Postgres中的

skill_id_array看起来像这样:{1,2,5}

因此,当传递给查询时,表达式用单引号括起来,您可以将它与any()一起使用。如果您对in()执行相同的操作,则显然会出现无效的语法:

where integerid in ('{1, 2, 5}');

ERROR:  invalid input syntax for integer: "{1, 2, 5}"   

或者,如果您的ORM使用自动投射:

where integerid in ('{1, 2, 5}'::int[]);

ERROR:  operator does not exist: integer = integer[]