Формат переменной 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, '|%');
Это должно работать как с строковыми, так и с числовыми столбцами.