Apa perbedaan antara! = NULL dan IS NOT NULL dalam ekspresi filter QGIS?

26

Saya memiliki lapisan bentuk dengan atribut yang berisi NULLnilai yang ingin saya terapkan filter untuk nilai yang berbeda NULL.

masukkan deskripsi gambar di sini

Menggunakan gui yang tersedia untuk konstruksi permintaan seperti itu, orang akan mencoba secara intuitif

"obj_art" != NULL

masukkan deskripsi gambar di sini

Yang berarti 'beri saya semua fitur dengan atribut "obj_art" berbeda dari NULL' (jumlah ini pasti lebih dari 0). Menguji permintaan ini memberikan hasil yang aneh dari sudut pandang saya:

masukkan deskripsi gambar di sini

Jadi yang saya pelajari sejauh ini adalah saya bisa mencapainya dengan menggunakan

"obj_art" IS NOT NULL

Pertanyaannya adalah, apa perbedaan antara != NULLdan IS NOT NULL?

Jochen Schwarze
sumber
Sejauh yang saya tahu itu hanya sintaks. Ketika null digunakan atau tidak. Gunakan lain = atau! =
nielsgerrits
"Seseorang akan secara intuitif mencoba" Benarkah? Mengapa? NULL bukan nilai. Secara harfiah tidak ada nilai. Anda tidak dapat "menyamai" NULL! Operator !=tidak berarti "tidak"; itu berarti "tidak sama dengan". IS NOTberarti "tidak" jadi saya pikir ini sangat intuitif :)
Lightness Races with Monica
@LightnessRacesinOrbit Tanpa pemahaman bahwa NULLtidak nilai saya akan mengatakan itu adalah intuitif untuk mencoba menggunakan =atau !=sebagai yang bagaimana Anda menilai nilai lain. Tidak sampai Anda tahu bahwa NULLitu bukan nilai yang benar-benar intuitif untuk digunakan IS NOTdaripada !=. Banyak yang tidak menyadari apa yang NULLsesungguhnya.
Midavalo
Dan selanjutnya, dalam GUI NULLada dalam daftar nilai (cp. Di atas), dan karenanya diperlakukan sebagai nilai 'normal'. Dan tidak ada tombol IS NULL, atau aku melewatkannya ?! Jadi, ketika hanya mengetik permintaan seperti itu dan dengan pengetahuan, yang NULLharus diperlakukan dengan cara khusus kita bisa membahas tentang intuisi, tetapi untuk shure tidak dalam konteks GUI INI.
Jochen Schwarze
@ Midavalo: Meskipun itu benar, saya dengan rendah hati menyarankan untuk tidak menggunakan fitur bahasa tanpa melihat apa itu :) Pemrograman dengan menebak tidak berfungsi.
Lightness Races dengan Monica

Jawaban:

33

Penafian: Karena sintaksis untuk memfilter dalam QGIS bekerja dengan SQL, saya mengasumsikan di sini bahwa aturan SQL berlaku. Saya tidak sepenuhnya yakin apakah itu sepenuhnya benar, tetapi tampaknya logis dan itu menjelaskan perilakunya.


Filter bekerja dengan SQL, itu sebabnya Anda harus mencari jawaban di sana.

Singkatnya, ketika menggunakan operator logis yang dikombinasikan dengan null, hasilnya selalu null. Tetapi untuk menguji null, SQL dilengkapi dengan IS (NOT)fungsi perbandingan, yang memungkinkan untuk menggunakannya untuk pemfilteran yang Anda inginkan.

Periksa jawaban Bohemian pada stackoverflow untuk diskusi yang lebih mendalam.

karpfen
sumber
19

NULLadalah tidak nilai, karena itu tidak bisa sama =atau tidak sama !=apa-apa. Ini tidak sama dengan nol 0yang merupakan nilai.

A NULLmenunjukkan bahwa tidak ada nilai yang telah direkam dalam sel yang Anda lihat. Untuk memeriksa apakah ada nilai, Anda bertanya apakah sel IS NULLatau jika ituIS NOT NULL

  • IS NULL memeriksa untuk melihat apakah sel kosong
  • IS NOT NULL memeriksa untuk melihat apakah sel tidak kosong

Jika Anda memiliki beberapa catatan di mana nilai-nilai One, Two, Threedan sisanya NULLdan Anda ingin mencari segala sesuatu yang tidak TwoAnda akan perlu menggunakan sesuatu seperti

value != 'Two' OR value IS NULL

karena nilai NULL tidak dikembalikan dalam kueri sama dengan / tidak sama dengan. Jika Anda hanya value != 'Three'menggunakan hasilnya akan mengecualikan semua NULLcatatan karena NULLbukan nilai yang bisa sama atau tidak sama.

Midavalo
sumber