sql-server - sentencia - procedimiento almacenado case sql server
SQL Server devuelve Filas que no son iguales<> a un valor y NULL (5)
¿Siempre tengo que incluir IS NULL o puedo configurarlo para que una cláusula where myCol <> 3 regrese las filas que tienen Null como valor para mi Col?
Siempre , siempre , siempre debes incluir is null
.
Porque 3 no es igual a No / Aplicable y no es igual a Desconocido.
Tengo una tabla que tiene una columna de valores que puede ser rowTypeID = (1,2,3 o nulo). Me gustaría escribir una consulta que devuelva cualquier fila que no tenga un valor de 3 en ella. En este ejemplo, quiero todas las filas NULL junto con todas las filas de 1,2, simplemente no quiero filas con el valor de 3
Establecer ANSI null ON está actualmente establecido para la base de datos.
Tengo curiosidad de por qué no puedo escribir
select * from myTable where myCol <> 3
Esta consulta no devolverá ninguna fila que tenga NULL en la columna myCol
Tengo que escribir
select * from my Table where myCol <> 3 or myCol Is NULL
¿Siempre tengo que incluir IS NULL o puedo configurarlo para que una cláusula Where myCol <> 3 regrese las filas que tienen Null como valor para mi Col
Cada vez que prueba un valor, se omiten todos los NULL; después de todo, está probando si el valor en alguna columna supera ciertos criterios y NULL no es un valor .
Creo que tu enfoque está bien:
SELECT *
FROM MyTable
WHERE myCol <> 3 OR myCol IS NULL
Como usted está pidiendo alternativas, otra forma de hacerlo es hacer que su columna NOT NULL
y almacene otro valor (no utilizado) en la base de datos en lugar de NULL
, por ejemplo -1
. Entonces, la expresión myCol <> 3
coincidirá con tu falso NULL
tal como lo haría con cualquier otro valor.
SELECT *
FROM MyTable
WHERE myCol <> 3
Sin embargo, en general, recomendaría no utilizar este enfoque. La forma en que lo estás haciendo es la correcta.
También podría valer la pena mencionar que varias otras bases de datos admiten IS DISTINCT FROM
que hace exactamente lo que usted desea:
SELECT *
FROM MyTable
WHERE myCol IS DISTINCT FROM 3
MySQL tiene el NULL-safe equal que también se puede usar para este propósito:
SELECT *
FROM MyTable
WHERE NOT myCol <=> 3
Lamentablemente, SQL Server aún no admite ninguna de estas sintaxis.
Debe manejar los NULL de una forma u otra, ya que las expresiones que implican NULL
evalúan como Desconocido . Si lo desea, podría hacer lo siguiente:
select *
from MyTable
where isnull(MyColumn, -1) <> 3
Pero esto implica un número mágico (-1), y es posiblemente menos legible que la prueba original para IS NULL
.
Editar: y, como señala SQLMenace, no es SARGable .
porque no se puede comparar NULL con nada más, NULL no es ni siquiera igual a NULL
DECLARE @i INT
DECLARE @i2 INT
SELECT @i = NULL, @i2 = NULL
IF @i = @i2
PRINT ''equal''
ELSE
PRINT ''not equal''