PostgreSQL中的IN错误:运算符不存在 integer = integer[]

6
在 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}

为什么会出现这个错误?我正在使用一个整数在一个整数数组的列中进行搜索。


如果我尝试使用' IN (unnest(skill_id_array))',我会得到一个错误:argument of IN must not return a set - Preston
1个回答

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

根据文档:

expression IN (value [, ...])

右侧是一个用括号括起来的标量表达式列表。

示例:
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[]

谢谢,这有助于澄清这个常见的问题。我查看了很多文档和建议,但是一片模糊。有一些例子使用DECLARE ... TABLE ...来进行变量声明,但我除了像这样设置之外没有找到任何有用的东西,而这也不起作用:IN (SELECT skill_id FROM skill_id_array)。文档和在线建议使得学习编码变得如此困难,无法避免硬编码值。关于这个问题有很多问题在线上,但回答都很简短和晦涩。我看到一个提示说这可能有效:IN (id1, id2, id5),但这需要将该列中的每个数组解析为变量,呃! - Preston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接