Intereting Posts
Добавить ограничение на значения, Mysql SQL для удаления дубликатов в таблице Обновление нескольких строк с использованием CASE WHEN – ORACLE Дизайн базы данных – продукты с несколькими категориями со свойствами MySQL IFNULL "N / A" дает "элемент не может быть найден в коллекции" Ошибка (Windows) Обработка исключений: в журнал событий или в базу данных? SQL Преобразование столбца в строку Могу ли я использовать MERGE INTO для имитации «upsert» в Apache Derby? Помогает ли хранимая процедура устранять SQL-инъекцию / Каковы преимущества хранимых процедур в нормальных выражениях SQL в приложениях? ORA-12015: невозможно создать быстрый обновленный материальный вид из сложного запроса Совокупность одного столбца в запросе со многими столбцами Союз на двух таблицах с предложением where в одном Ошибка MySQL 1215 Невозможно добавить ограничение внешнего ключа – FK в разных таблицах Разница между этими двумя подходами к столу? Создание подзапроса с помощью Arel для получения среднего значения средних значений

Формат переменной 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; 

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

Вы не можете использовать предложение IN так. Он компилируется в одну строку в вашем разделе 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 

если вы используете 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, '|%'); 

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