2012-05-02 29 views
16

¿Cómo selecciono las filas que no son iguales a un valor y también incluyo nulos en los datos devueltos? He intentado:T-SQL: seleccionar filas que no sean iguales a un valor, incluidos los nulos

SET ANSI_NULLS OFF 
SELECT TOP 30 FROM Mails 
WHERE assignedByTeam <> 'team01' 

Quiero devolver filas que no tienen 'team01' en la columna assignedByTeam pero también quiero resultados con valores nulos. Lamentablemente, el código anterior no funciona (no devuelve los valores nulos).

Estoy usando MS SQL Server 2008 Express.

Respuesta

19

Intente comprobar NULL explícita:

SELECT TOP 30 col1, col2, ..., coln 
FROM Mails 
WHERE (assignedByTeam <> 'team01' OR assignedByTeam IS NULL) 
+0

+1 esta es la belleza de la lógica booleana. – JonH

+1

Bueno, sí, pero pensé que había una manera más corta de hacer esto, como un solo comando en lugar de escribir algunos de ellos. De todos modos, ¡gracias por el esfuerzo! – Val

+4

@ValCool: en el estándar SQL hay un operador para esto llamado 'IS DISTINCT FROM' pero SQL Server no lo admite. MySQL tiene el operador de igualdad nulo no seguro 'NO a <=> b', pero SQL Server no puede hacer esto tampoco. –

0
where column != 'value' or column is null 
+0

¿'' = funciona en la mayoría de los dialectos SQL? – MarioDS

+1

@MarioDeSchaepmeester: Sí, lo hace. –

3
SELECT TOP 30 FROM Mails 
WHERE assignedByTeam <> 'team01' 
OR assignedByTeam is null 
8

Cuando usted tiene un montón de condiciones, a escribir todo lo que huele mal dos veces. Aquí hay dos alternativas mejores:

SELECT TOP 30 FROM Mails 
WHERE COALESCE(assignedByTeam,'') <> 'team01' 

El operador COALESCE devuelve el primer valor no nulo en la lista. Si assignedByTeam NO es nulo, comparará el valor de assignedByTeam con 'team01'. Pero si assignByTeam IS es nulo, comparará un '' en blanco '' con el equipo01 ''. Se trata básicamente de forma rápida para las siguientes:

SELECT TOP 30 FROM Mails 
WHERE (CASE WHEN assignedByTeam IS NULL THEN '' ELSE assignedByTeam END) <> 'team01' 

La segunda forma es hacer que su condición condicional, por ejemplo:

SELECT TOP 30 FROM Mails 
WHERE 1 = CASE WHEN assignedByTeam = 'team01' THEN 0 ELSE 1 END 

En este ejemplo, el valor más va a incluir todas las filas nulas, ya que aren 't igual a' team01 '.

+0

Si pudiera votar dos veces por esto, lo haría. – Matt

+0

Tengo mi voto. Pulgares hacia arriba. – MikeJRamsey56

10
SELECT TOP 30 FROM Mails 
WHERE ISNULL(AssignedByTeam,'') <> 'team01' 

Vi una versión de declaración coalescente pero ISNULL() es más eficiente.

+1

Esta es la solución más elegante en mi opinión. – Amarundo

Cuestiones relacionadas