我正在尝试在使用in运算符的sql语句中使用参数。该语句的用途是删除不在列表中的组的任何成员身份,因此我的代码如下。。。
const accessGroupId = 1; // Access Group
const membershipIds = [1, 2, 3]; // Keep those IDs, delete all others
Database.run(`
DELETE
FROM AccessGroup
WHERE
accessGroupId = $accessGroupId AND
membershipId NOT IN ($membershipIds);`,
{
$accessGroupId: accessGroupId,
$membershipIds: membershipIds.join(",")
}
);
在参数解析后,我希望这个语句看起来是这样的。。。
DELETE
FROM AccessGroup
WHERE
accessGroupId = 1 AND
membershipId NOT IN (1,2,3);
然而,这并没有如预期的那样起作用。不是只删除成员身份id不是1、2或3的访问组1中的条目,而是删除该访问组的所有条目。
如果我按以下方式更改代码并按手连接语句,代码确实可以正常工作。。。
const accessGroupId = 1; // Access Group
const membershipIds = [1, 2, 3]; // Keep those IDs, delete all others
Database.run(`
DELETE
FROM AccessGroup
WHERE
accessGroupId = $accessGroupId AND
membershipId NOT IN (${membershipIds.join(",")});`,
{
$accessGroupId: accessGroupId
}
);
由于这是有效的,当它作为参数传递时,必须使用逗号分隔的列表。
如果可能的话,我想对所有事情都使用参数。有人知道为什么这不起作用吗?
我不是JavaScript专家,但我知道:
membershipIds.join(",")
返回一个字符串,这样您的最终查询看起来像这样:
DELETE FROM AccessGroup
WHERE accessGroupId = 1
AND membershipId NOT IN ('1,2,3');
因此,IN
运算符的列表只包含1个值,字符串:'1,2,3'
和所有membershipId
都与该值进行比较,由于它们都不匹配,因此accessGroupId = 1
的所有行都被删除
作为替代方案,您可以使用操作员LIKE
:
Database.run(`
DELETE FROM AccessGroup
WHERE accessGroupId = $accessGroupId
AND ',' || $membershipIds || ',' NOT LIKE '%,' || membershipId || ',%'`,
{
$accessGroupId: accessGroupId,
$membershipIds: membershipIds.join(",")
}
);