从例子where-col-in 示例 https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#where-col-in-values and 这个答案 https://stackoverflow.com/a/36847936/3563619, WHERE IN
子句应包含带有以下语法参数的查询
const response = await db.any('SELECT * FROM table WHERE id IN ($1:csv)', [data])
其中 data 是一个数组。
现在,当 data 是空数组时,它会生成以下查询
SELECT * FROM users WHERE id IN ()
这是一个语法错误。
考虑以下陈述:
-
这有效
const x = await db.any('SELECT * FROM table WHERE id IN ($1:csv)', [[1, 2, 3]]);
-
这不起作用
const y = await db.any('SELECT * FROM table WHERE id IN ($1:csv)', [[]]);
A 类似的错误 https://github.com/hiddentao/squel/issues/179报告为squel
图书馆有关于如何的答案knex
和红宝石的sequel
在这种情况下表现。
这是一个错误还是我做错了什么?是否有适用于这两种情况的替代语法。
例如,使用替代查询ANY
适用于两种情况:
await db.any(`SELECT * FROM table WHERE id = ANY($1)`, [[1, 2, 3]]);
await db.any(`SELECT * FROM table WHERE id = ANY($1)`, [[]]);
最好的方式应该是什么WHERE col IN
还可以将空数组作为参数处理的查询?
Library pg-承诺 https://github.com/vitaly-t/pg-promise让您完全自由地生成任何您想要的 SQL,它不会以任何方式验证或控制它,因为它不是 ORM。
CSV 过滤器 https://github.com/vitaly-t/pg-promise#csv-filter是通用的,它可以在各种上下文中用于生成查询。所以当你专门使用它时IN ($1:csv)
,它不知道,并再次产生通用输出。
根据我留下的评论这个问题 https://github.com/vitaly-t/pg-promise/issues/442,正确的方法是检查数组中是否有任何数据,如果没有,则根本不执行查询。首先,查询将是无效的,即使你用一些空逻辑修补它,也意味着它不会生成任何结果,并且执行这样的查询会浪费IO。
let result = [];
if (data.length) {
result = await db.any('SELECT * FROM table WHERE id IN ($1:csv)', [data]);
}
/* else: do nothing */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)