2012-05-02 37 views
16

Come faccio a selezionare le righe che non sono uguali a un valore e includono anche valori nulli nei dati restituiti? Ho provato:T-SQL: selezionare le righe non uguali a un valore, compresi i valori nulli

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

voglio restituire le righe che non hanno 'team01' nella colonna assignedByTeam ma voglio anche risultati con valori nulli. Sfortunatamente, il codice sopra non funziona (non restituisce i valori null).

Utilizzo MS SQL Server 2008 Express.

risposta

19

Prova a controllare per NULL in modo esplicito:

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

+1 questa è la bellezza della logica booleana. – JonH

+1

Beh, sì ma ho pensato che c'era un modo più breve per farlo, come un solo comando invece di scriverne alcuni. Comunque, grazie per lo sforzo! – Val

+4

@ValCool: nello standard SQL esiste un operatore chiamato "IS DISTINCT FROM" ma SQL Server non lo supporta. MySQL ha l'operatore di uguaglianza null-safe non standard 'NOT a <=> b', ma SQL Server non può farlo neanche. –

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

fa '! =' Funziona nella maggior parte dei dialetti SQL? – MarioDS

+1

@MarioDeSchaepmeester: Sì, lo fa. –

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

Quando hai un sacco di condizioni, digitando tutto due volte puzza. Qui ci sono due alternative migliori:

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

L'operatore COALESCE restituisce il primo valore non nullo nell'elenco. Se assegnatoByTeam NON è nullo, esso confronterà il valore assegnatoByTeam con 'team01'. Ma se assegnatoByTeam è nullo, confronterà un vuoto '' a 'team01'. E 'fondamentalmente una scorciatoia per il seguente:

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

Il secondo modo è quello di rendere la vostra condizione condizionale, ad esempio:

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

In questo esempio, il valore ELSE includerà tutte le righe nulli, dal momento che aren 'uguale a' team01 '.

+0

Se potessi votare due volte per questo, lo farei. – Matt

+0

Ho ottenuto il mio voto. Pollice su. – MikeJRamsey56

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

Ho visto una versione di istruzione in coalesce ma ISNULL() è più efficiente.

+1

Questa è la soluzione più elegante a mio parere. – Amarundo

Problemi correlati