这个 WHERE ANY 查询在 Nestjs/Express 中工作正常:
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()
需要一个标量列表,而any()
需要一个数组表达式。
根据文档:
表达式 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[]