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

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, '|%');

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