uso operador not ejemplos sql sql-server tsql sql-like

operador - uso de like en sql



NO ME GUSTA y NO ME GUSTA no devolver resultados opuestos (6)

  1. Select * from tbl1 WHERE ([TextCol] NOT LIKE ''%TAX%'') AND ([TextCol] NOT LIKE ''%TAX%'')

  2. select * from tbl1 where [TextCol] NOT LIKE ''%TAX%'' OR [TextCol] IS NULL

Tengo una tabla con 200 registros de los cuales 10 registros tienen texto que contiene la palabra ''IMPUESTO''.

Cuando estoy ejecutando

Select * from tbl1 WHERE [TextCol] LIKE ''%TAX%''

entonces obtengo el conjunto de resultados con esos 10 registros correctamente.

Pero cuando trato de excluir esos registros por

Select * from tbl1 WHERE [TextCol] NOT LIKE ''%TAX%''

solo devuelve 100 registros, en lugar de 190.


¡Me pasó a mí una vez también! después de romper la cabeza, descubrí que se debía a valores nulos, por lo que puede usar esta consulta para evitarlo:

WHERE CASE WHEN [TextCol] IS NULL THEN ''default'' ELSE [TextCol] END NOT LIKE ''%TAX%''


¿Esto devuelve el resultado correcto?

Select * from tbl1 WHERE COALESCE([TextCol],''-1'') NOT LIKE ''%TAX%''

Creo que los valores NULL son el problema aquí, si la columna los contiene, entonces NULL NOT LIKE ''%TAX%'' devolverá UNKNOWN/NULL y, por lo tanto, no se seleccionará.

Le aconsejo que lea sobre el manejo con valores NULL , o here .

Como sugirió @ughai, si el rendimiento es un problema, también puede usar:

Select * from tbl1 WHERE [TextCol] NOT LIKE ''%TAX%'' OR [TextCol] IS NULL


También debe verificar los valores NULL:

[TextCol] NOT LIKE ''%TAX%'' OR [TextCol] IS NULL

Esto también debería ocuparse de los valores nulos, lo que probablemente sea la razón por la que no obtuvo todas las filas en la salida.


Tuve el mismo problema con el operador IN en una columna int simple con nulos. Descubrí que estos no eran inversos como pensaba. (Me di cuenta por el recuento de filas)

select * from Dest where id in(select id from Source) select * from Dest where id NOT in(select id from Source)

Para que los demás se invirtieran, también tuve que reescribirlos como tales:

select * from Dest where isnull(id,-2) in(select isnull(id,-1) from Source) select * from Dest where isnull(id,-2) NOT in(select isnull(id,-1) from Source)


(A) Los operadores de comparación de SQL dan como resultado tres valores posibles: verdadero, falso y desconocido. Si uno o ambos operandos son NULL , el resultado es Desconocido. Considere el siguiente ejemplo donde comparamos algunos valores (la edad de una persona) con una constante (18):

21 >= 18 -- True 15 >= 18 -- False NULL >= 18 -- Unknown

Como puede ver, la base de datos puede / no decidirá si NULL es mayor o igual que 18.

(B) La base de datos solo devolverá filas donde la cláusula WHERE evalúa como True. Invertir la expresión (por ejemplo, WHERE age >= 18 cambiado a WHERE age < 18 ) no afecta los resultados desconocidos.

Puede usar IS [NOT] NULL para hacer coincidir los valores NULL . La siguiente consulta seleccionará las filas donde la columna no coincide con el patrón O la columna es NULL:

WHERE [TextCol] NOT LIKE ''%TAX%'' OR [TextCol] IS NULL

Se pueden ISNULL funciones como ISNULL y COALESCE para transformar NULL en algún valor.