tutorial - Formato variable de MySQL para una lista de valores "NO EN"
para que sirve elastic search (3)
Al usar CONCAT()
, un separador de tubos (en lugar de una coma) y un poco de "lógica inversa", puede usar una variable en su lista NOT IN
, pero en su lugar, ¡utilizando NOT LIKE
!
Ejemplo:
SET @idcamposexcluidos = ''|817|803|495|'';
SELECT
*
FROM
your_table
WHERE
@idcamposexcluidos NOT LIKE CONCAT(''%|'', id_campo, ''|%'');
Esto debería funcionar tanto con cadenas como con columnas numéricas.
Enloqueciéndome tratando de establecer una variable en una consulta de tipo:
SET @idcamposexcluidos=''817,803,495'';
entonces puedo usarlo en una
WHERE id_campo not in (@idcamposexcluidos)
Intenté definir la variable en diferentes formatos sin suerte y no parece encontrar un ejemplo específico para lo anterior:
SET @idcamposexcluidos=''(817,803,495)'';
...
WHERE id_campo not in @idcamposexcluidos
SET @idcamposexcluidos=817,803,495;
sin éxito Devuelve un error o ignora los valores.
No puedes usar la cláusula IN
así. Compila una sola cadena en su cláusula IN
. Pero una cláusula IN
necesita valores separados .
WHERE id_campo not in (@idcamposexcluidos)
compila a
WHERE id_campo not in (''817,803,495'')
pero debería ser
WHERE id_campo not in (''817'',''803'',''495'')
Para superar esto, utilice SQL dinámico o en MySQL, puede usar FIND_IN_SET :
SET @idcamposexcluidos=''817,803,495'';
...
WHERE FIND_IN_SET(id_campo, @idcamposexcluidos) = 0
pero usar una función como FIND_IN_SET()
no puede hacer uso de índices.
si usa mysql> 5.1, puede usar:
CREATE TYPE lista as (
clave int4,
valor int4
);
CREATE OR REPLACE FUNCTION test(IN vArray lista[])
...
WHERE FIND_IN_SET(id_campo, vArray)
...
en otro caso puedes usar un truco:
WHERE id_campo IN ( SELECT 817 as valor UNION ALL
SELECT 803 as valor UNION ALL
SELECT 495 as valor)