Использовать список, разделенный запятыми, для оператора IN в качестве параметра

Я пытаюсь использовать параметры в инструкции 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
        }
    );

Поскольку это работает, что-то должно прерываться в списке, разделенном запятыми, когда он передается в качестве параметра.

Если это вообще возможно, я хотел бы использовать параметры для всего. Кто-нибудь знает, почему это не работает?

Это сложная задача для любого языка программирования. Вопрос: известно ли вам максимальное количество терминов, которые могут появиться в предложении IN?

Tim Biegeleisen 11.12.2020 10:58

Обычно проще передать список в виде xml или преобразовать его в xml и сделать выбор по нему. Не могу сказать вам синтаксис в sqlite хотя.

Lain 11.12.2020 10:59

@TimBiegeleisen Нет, но это должно быть больше, чем 3, с которыми я пытаюсь заставить его работать. Я не думаю, что количество терминов в заявлении IN является проблемой.

Endauriel 11.12.2020 11:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
280
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не эксперт в 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(",")
    }
);

Другие вопросы по теме