operador - uso de like en sql
NO ME GUSTA y NO ME GUSTA no devolver resultados opuestos (6)
-
Select * from tbl1 WHERE ([TextCol] NOT LIKE ''%TAX%'') AND ([TextCol] NOT LIKE ''%TAX%'')
-
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.