将IN语句的逗号分隔列表用作参数



我正在尝试在使用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(",")
}
);

最新更新