Mam warstwę kształtu z atrybutem zawierającym NULL
wartości, do których chciałbym zastosować filtr dla wartości innych niż NULL
.
Korzystając z dostępnych GUI do takiej konstrukcji zapytań, można by intuicyjnie spróbować
"obj_art" != NULL
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:
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 != NULL
i IS NOT NULL
?
!=
nie oznacza „nie jest”; oznacza to „nie równa się”.IS NOT
znaczy „nie jest”, więc myślę, że jest to całkowicie intuicyjne :)NULL
nie 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, żeNULL
nie jest to wartość, która jest bardzo intuicyjny w obsłudzeIS NOT
niż!=
. Wielu nie zdaje sobie sprawy z tego, czymNULL
naprawdę jest.NULL
znajduje się na liście wartości (patrz powyżej), a zatem jest traktowany jako „normalna” wartość. I nie ma przyciskuIS NULL
, a może tak mi brakowało ?! Tak więc, po prostu wpisując takie zapytanie i ze świadomością,NULL
należy to potraktować w specjalny sposób, możemy omówić intuicję, ale dla pewności nie w kontekście TEGO GUI.Odpowiedzi:
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
null
wynikiem jest zawszenull
. Ale w celu przetestowanianull
SQL 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ę.
źródło
NULL
jest nie wartość, dlatego nie może być równa=
lub nie równy!=
czegokolwiek. To nie to samo, co zero,0
które jest wartością.NULL
Wskazuje, że wartość nie została zapisana w komórce ty patrzysz. Aby sprawdzić, czy istnieje wartość, pytasz, czy komórka,IS NULL
czy jeśliIS NOT NULL
IS NULL
sprawdza, czy komórka jest pustaIS NOT NULL
sprawdza, czy komórka nie jest pustaJeśli masz jakieś rekordy A gdzie wartości są
One
,Two
,Three
a resztaNULL
i chcesz znaleźć wszystko, co nie jestTwo
Ci to potrzebne, aby użyć czegoś podobnegovalue != '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 wszystkieNULL
rekordy, ponieważNULL
nie jest to wartość, która może być równa lub różna.źródło