Формат переменной MySQL для списка значений" не в"
сходит с ума, пытаясь установить переменную в запросе типа:
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;
без успеха. Он либо возвращает ошибку, либо игнорирует значения.
3 ответа:
вы не можете использовать
IN
п. подобное. Он компилируется в один в строкуIN
предложения. Но АнIN
пункт должен отдельные значения.WHERE id_campo not in (@idcamposexcluidos)
компилируется в
WHERE id_campo not in ('817,803,495')
но он должен быть!--13-->
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
но с помощью функции, как
FIND_IN_SET()
не может использовать индексы.
Если вы используете 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)
С помощью
CONCAT()
, разделитель труб (вместо запятой) и немного "обратной логики", вы можете использовать переменную в своемNOT IN
список, но вместо этого - с помощьюNOT LIKE
!пример:
SET @idcamposexcluidos = '|817|803|495|'; SELECT * FROM your_table WHERE @idcamposexcluidos NOT LIKE CONCAT('%|', id_campo, '|%');
это должно работать как со строковыми, так и с числовыми столбцами.