Формат переменной MySQL для списка значений "NOT IN"

Сходит с ума, пытаясь установить переменную в запросе типа:

SET @idcamposexcluidos='817,803,495';

поэтому я могу использовать его на

WHERE id_campo not in (@idcamposexcluidos)

Я попытался определить переменную в разных форматах без везения и, похоже, не нашел конкретного примера для вышеперечисленного:

SET @idcamposexcluidos='(817,803,495)';
...
WHERE id_campo not in @idcamposexcluidos


SET @idcamposexcluidos=817,803,495;

без успеха. Он либо возвращает ошибку, либо игнорирует значения.

Ответ 1

Вы не можете использовать предложение IN, подобное этому. Он компилируется в строку single в вашем предложении IN. Но для предложения IN требуются отдельные значения.

WHERE id_campo not in (@idcamposexcluidos)

компилируется в

WHERE id_campo not in ('817,803,495')

но это должно быть

WHERE id_campo not in ('817','803','495')

Чтобы преодолеть это или использовать динамический SQL или MySQL, вы можете использовать FIND_IN_SET:

SET @idcamposexcluidos='817,803,495';
...
WHERE FIND_IN_SET(id_campo, @idcamposexcluidos) = 0

Ответ 2

если вы используете mysql > 5.1, вы можете использовать:

CREATE TYPE lista as (
    clave int4,
    valor int4
);

CREATE OR REPLACE FUNCTION test(IN vArray lista[])
...

   WHERE FIND_IN_SET(id_campo, vArray)
...

в другом случае вы можете использовать трюк:

WHERE id_campo IN ( SELECT 817 as valor UNION ALL 
                SELECT 803 as valor UNION ALL
                    SELECT 495 as valor)

Ответ 3

Используя CONCAT(), разделитель каналов (вместо запятой) и немного "обратную логику", вы можете использовать переменную в своем списке NOT IN, но вместо этого - с помощью NOT LIKE!

Пример:

SET @idcamposexcluidos = '|817|803|495|';

SELECT
    *
FROM
    your_table
WHERE
    @idcamposexcluidos NOT LIKE CONCAT('%|', id_campo, '|%');

Это должно работать как с строковыми, так и с числовыми столбцами.