2013-04-26 8 views
17

Jestem po prostu ciekawy. Wiem o NULL bezpiecznego równego operatora < =>, ale jest tam jakiś NULL bezpieczny nie jest równa operator, albo muszę zawsze używać coś takiego:MySQL - NULL bezpieczne NIE równy operator

(tab.id != 1 OR tab.id IS NULL) 

lub ktoś preferuje

!(tab.id <=> 1) 

Odpowiedz

7
COALESCE(tab.id, 0) != 1 

Może być używany tutaj, jeśli Ci się spodoba. Przechodzę przez parametry i zwracam pierwszą wartość, która nie jest NULL. W tym przypadku, jeśli jest to NULL, będzie porównywać 0 != 1. Chociaż może używać więcej znaków, nadal łatwiej jest zarządzać, zamiast być zmuszonym do tego, aby zawsze mieć przeciwne "booleany" jako rozwiązanie w tych przypadkach.

dokumentacja czytać COALESCE()

+0

Myślę, że jest to preferowana metoda, ponieważ to zapytanie będzie również działać na serwerze SQL. Najlepszą metodą jest brak wartości zerowych i prawidłowe ustawienie domyślne, ale dane źródłowe nie zawsze mogą być kontrolowane przez programistę. –

+3

Niestety, jeśli nie znasz wartości na RHS tego porównania, nie wiesz, co COALESCE() twój NULL do! – Arth

+0

Działa to, jeśli chcesz porównać tab.id z wartością, ale nie działa, jeśli chcesz porównać dwa pola, takie jak tab.id z tab_childs.tab_id. –

8

Okazało się, że NIE (NULL < => 1) działa i myślę, że jest to również zgodne z normą ISO, ale jest uciążliwe. Lepszym sposobem, aby pokazać za pomocą nazwy kolumn byłoby tak: NIE (tbl.col1 < => 1)

+2

'<=>' nie jest standardowym SQL, to rozszerzenie MySQL. Standardowe ekwiwalentne zerowe porównanie jest, zazwyczaj dla SQL, znacznie bardziej szczegółowe: 'IS [NIE] DISTINCT FROM'. –

0

Jeśli wiesz, że RHS porównania IS NOT NULL:

COALESCE(tab.id != 1, 1) 

Albo

COALESCE(tab.id != 1, TRUE) 

da poprawny wynik.

Czy jest lepszy bardziej czytelny niż:

(tab.id != 1 OR tab.id IS NULL) 

jest dyskusyjna ..

będę również pokusić się odfiltrować logikę NULL najpierw z porównaniem, więc nie mam do pomyśl o nich! pewnie bym napisać swój pierwszy równania jako:

(tab.id IS NULL OR tab.id != 1) 

Wydajność zależy od występowania NULL s jednak.

1

Teraz MySQL nie ma operatora NULL-safe not equal.

Korzystanie MySQL najbardziej uniwersalnym rozwiązaniem jest:

!(tab.id <=> 1) 

lub

NOT tab.id <=> 1 

bo to będzie działać poprawnie, jeśli nawet w miejscu 1 użyjesz NULL.