Jaka jest różnica między! = NULL i NIE JEST NULL w wyrażeniach filtra QGIS?

26

Mam warstwę kształtu z atrybutem zawierającym NULLwartości, do których chciałbym zastosować filtr dla wartości innych niż NULL.

wprowadź opis zdjęcia tutaj

Korzystając z dostępnych GUI do takiej konstrukcji zapytań, można by intuicyjnie spróbować

"obj_art" != NULL

wprowadź opis zdjęcia tutaj

Co oznacza, że „daj mi wszystkie funkcje z atrybutem„ obj_art ”innym niż NULL (te liczą zdecydowanie więcej niż 0). Testowanie tego zapytania daje dziwny wynik z mojego punktu widzenia:

wprowadź opis zdjęcia tutaj

Do tej pory nauczyłem się, że mogę to osiągnąć za pomocą

"obj_art" IS NOT NULL

Pytanie brzmi, jaka jest różnica między != NULLi IS NOT NULL?

Jochen Schwarze
źródło
O ile mi wiadomo, to tylko składnia. Gdy użycie zerowe jest lub nie jest. W przeciwnym razie użyj = lub! =
nielsgerrits
„ktoś intuicyjnie próbowałby” Naprawdę? Czemu? NULL nie jest wartością. Jest to dosłownie brak wartości. Nie możesz „równać się” NULL! Operator !=nie oznacza „nie jest”; oznacza to „nie równa się”. IS NOTznaczy „nie jest”, więc myślę, że jest to całkowicie intuicyjne :)
Lekkość ściga się z Moniką
@LightnessRacesinOrbit Bez zrozumienia, że NULLnie jest to wartość, powiedziałbym, że jest intuicyjne w użyciu =lub !=w taki sposób oceniasz każdą inną wartość. To nie jest aż wiesz, że NULLnie jest to wartość, która jest bardzo intuicyjny w obsłudze IS NOTniż !=. Wielu nie zdaje sobie sprawy z tego, czym NULLnaprawdę jest.
Midavalo
Co więcej, w GUI NULLznajduje się na liście wartości (patrz powyżej), a zatem jest traktowany jako „normalna” wartość. I nie ma przycisku IS NULL, a może tak mi brakowało ?! Tak więc, po prostu wpisując takie zapytanie i ze świadomością, NULLnależy to potraktować w specjalny sposób, możemy omówić intuicję, ale dla pewności nie w kontekście TEGO GUI.
Jochen Schwarze
@Midavalo: Chociaż to prawda, pokornie sugeruję, aby nie używać funkcji języka bez sprawdzania, co to jest :) Programowanie przez zgadywanie nie działa.
Lekkość ściga się z Moniką

Odpowiedzi:

33

Zastrzeżenie: Ponieważ składnia do filtrowania w QGIS działa z SQL, zakładam tutaj, że obowiązują reguły SQL. Nie jestem do końca pewien, czy to całkowicie poprawne, ale wydaje się to logiczne i wyjaśnia zachowanie.


Filtr działa z SQL, dlatego musisz tam poszukać odpowiedzi.

Krótko mówiąc, w przypadku użycia operatora logicznego w połączeniu z nullwynikiem jest zawsze null. Ale w celu przetestowania nullSQL zawiera funkcję IS (NOT)porównywania, która pozwala na użycie go do zamierzonego filtrowania.

Sprawdź odpowiedź Czecha na temat przepełnienia stosu, aby uzyskać bardziej szczegółową dyskusję.

karpfen
źródło
19

NULLjest nie wartość, dlatego nie może być równa =lub nie równy !=czegokolwiek. To nie to samo, co zero, 0które jest wartością.

NULLWskazuje, że wartość nie została zapisana w komórce ty patrzysz. Aby sprawdzić, czy istnieje wartość, pytasz, czy komórka, IS NULLczy jeśliIS NOT NULL

  • IS NULL sprawdza, czy komórka jest pusta
  • IS NOT NULL sprawdza, czy komórka nie jest pusta

Jeśli masz jakieś rekordy A gdzie wartości są One, Two, Threea reszta NULLi chcesz znaleźć wszystko, co nie jest TwoCi to potrzebne, aby użyć czegoś podobnego

value != 'Two' OR value IS NULL

ponieważ wartości NULL nie są zwracane w zapytaniu równym / różnym. Jeśli użyjesz tylko value != 'Three'wyniku, wykluczy wszystkie NULLrekordy, ponieważ NULLnie jest to wartość, która może być równa lub różna.

Midavalo
źródło