Я пытаюсь использовать параметры в инструкции sql, которая использует оператор IN. Использование этого оператора заключается в удалении любого членства в группе, которых нет в списке, поэтому мой код выглядит следующим образом...
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);
Однако это не работает должным образом. Вместо удаления только записей из группы доступа 1, где идентификатор членства НЕ равен 1, 2 или 3, удаляются все записи для группы доступа.
Код работает так, как ожидалось, если я изменю его следующим образом и объединим оператор для каждой руки...
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
}
);
Поскольку это работает, что-то должно прерываться в списке, разделенном запятыми, когда он передается в качестве параметра.
Если это вообще возможно, я хотел бы использовать параметры для всего. Кто-нибудь знает, почему это не работает?
Обычно проще передать список в виде xml или преобразовать его в xml и сделать выбор по нему. Не могу сказать вам синтаксис в sqlite
хотя.
@TimBiegeleisen Нет, но это должно быть больше, чем 3, с которыми я пытаюсь заставить его работать. Я не думаю, что количество терминов в заявлении IN является проблемой.
Я не эксперт в 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(",")
}
);
Это сложная задача для любого языка программирования. Вопрос: известно ли вам максимальное количество терминов, которые могут появиться в предложении
IN
?