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