2012-05-02 7 views
16

Jak wybrać wiersze, które nie są równe wartości, a także uwzględniają wartości null w zwracanych danych? Próbowałem:T-SQL: wybierz wiersze nie równe wartości, w tym wartości zerowe

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

chcę wrócić wiersze, które nie mają „team01” w kolumnie assignedByTeam ale również chcę wyników zawierających wartości null. Niestety powyższy kod nie działa (nie zwraca zer).

Używam MS SQL Server 2008 Express.

Odpowiedz

19

Spróbuj sprawdzanie NULL jawnie:

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

+1 To jest piękno logiki boolowskiej. – JonH

+1

No tak, ale myślałem, że istnieje krótszy sposób robienia tego, jak jedno polecenie, zamiast napisania kilku z nich. W każdym razie, dzięki za wysiłek! – Val

+4

@ValCool: W standardzie SQL jest operator o nazwie 'IS DISTINCT FROM', ale SQL Server go nie obsługuje. MySQL ma niestandardowego null-safe operatora równości 'NOT a <=> b', ale SQL Server też nie może tego zrobić. –

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

Czy '! =' Działa w większości dialektów SQL? – MarioDS

+1

@MarioDeSchaepmeester: Tak. –

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

Kiedy masz wiele warunków, wpisując wszystko dwa razy śmierdzi. Oto dwie lepsze alternatywy:

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

Operator COALESCE zwraca pierwszą wartość inną niż null na liście. Jeśli parametr assignByTeam NIE ma wartości NULL, porównuje wartość assignByTeam z wartością "team01". Ale jeśli właściwość assignByTeam IS jest pusta, porównuje pustą drużynę01. Jest to w zasadzie skrótem następujące:

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

Drugim sposobem jest, aby twój stan warunkowa, na przykład:

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

W tym przykładzie wartość inny będzie obejmować wszystkie pustych wierszy, ponieważ aren "T równa" team01 ".

+0

Gdybym mógł dwukrotnie głosować za to, zrobiłbym to. – Matt

+0

Mam swój głos. Kciuki w górę. – MikeJRamsey56

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

Widziałem wersję instrukcji coalesce, ale ISNULL() jest bardziej wydajna.

+1

To jest najbardziej eleganckie rozwiązanie, moim zdaniem. – Amarundo

Powiązane problemy