when sentencia procedimiento funcion formato filas condicion clausula almacenado afectadas sql-server null

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''