Sự khác biệt giữa! = NULL và IS NOT NULL trong các biểu thức lọc của QGIS là gì?


26

Tôi có một lớp hình dạng với một thuộc tính chứa NULLcác giá trị mà tôi muốn áp dụng bộ lọc cho các giá trị khác với NULL.

nhập mô tả hình ảnh ở đây

Sử dụng gui có sẵn để xây dựng truy vấn như vậy, người ta sẽ thử bằng trực giác

"obj_art" != NULL

nhập mô tả hình ảnh ở đây

Có nghĩa là 'cung cấp cho tôi tất cả các tính năng có thuộc tính "obj_art" khác với NULL' (những số này chắc chắn nhiều hơn 0). Kiểm tra truy vấn này mang lại một kết quả lạ theo quan điểm của tôi:

nhập mô tả hình ảnh ở đây

Vì vậy, những gì tôi đã học được cho đến nay là tôi có thể đạt được điều này bằng cách sử dụng

"obj_art" IS NOT NULL

Câu hỏi là, sự khác biệt giữa != NULLvà là IS NOT NULLgì?


Theo tôi biết đó chỉ là cú pháp. Khi sử dụng null là hoặc không. Khác sử dụng = hoặc! =
nielsgerrits

"Một người sẽ trực giác thử" Thật sao? Tại sao? NULL không phải là một giá trị. Đó là nghĩa đen của sự vắng mặt của một giá trị. Bạn không thể "bằng" NULL! Toán tử !=không có nghĩa là "không"; nó có nghĩa là "không bằng". IS NOTcó nghĩa là "không phải" vì vậy tôi nghĩ rằng điều này là hoàn toàn trực quan :)
Cuộc đua nhẹ nhàng với Monica

@LightnessRacesinOrbit Nếu không hiểu đó NULLkhông phải là một giá trị tôi sẽ nói rằng nó trực quan để cố gắng sử dụng =hoặc !=đó là cách bạn đánh giá bất kỳ giá trị nào khác. Không phải cho đến khi bạn biết rằng đó NULLkhông phải là một giá trị mà nó thực sự trực quan để sử dụng IS NOThơn là !=. Nhiều người không nhận thức được NULLthực sự là gì.
Midavalo

Và hơn nữa, trong GUI NULLnằm trong danh sách giá trị (cp. Ở trên) và do đó được coi là giá trị 'bình thường'. Và không có nút nào IS NULL, hoặc tôi đã bỏ lỡ như vậy?! Vì vậy, khi chỉ cần gõ truy vấn như vậy và với kiến ​​thức, điều đó NULLphải được xử lý theo cách đặc biệt, chúng ta có thể thảo luận về trực giác, nhưng đối với shure không phải trong bối cảnh GUI NÀY.
Jochen Schwarze

@Unavalo: Mặc dù điều đó là đúng, tôi sẽ khiêm tốn đề nghị không sử dụng tính năng ngôn ngữ mà không tìm kiếm nó là gì :) Lập trình bằng cách đoán không hoạt động.
Cuộc đua nhẹ nhàng với Monica

Câu trả lời:


33

Tuyên bố miễn trừ trách nhiệm: Vì cú pháp lọc trong QGIS hoạt động với SQL, nên tôi giả sử ở đây áp dụng quy tắc SQL. Tôi không hoàn toàn chắc chắn nếu điều đó hoàn toàn chính xác, nhưng nó có vẻ hợp lý và nó giải thích hành vi.


Bộ lọc hoạt động với SQL, đó là lý do tại sao bạn phải tìm kiếm câu trả lời.

Nói tóm lại, khi sử dụng toán tử logic kết hợp với null, kết quả luôn luôn null. Nhưng để kiểm tra null, SQL đi kèm với IS (NOT)chức năng so sánh, cho phép sử dụng nó cho mục đích lọc của bạn.

Kiểm tra câu trả lời của Bohemian trên stackoverflow để thảo luận sâu hơn.


19

NULLkhông một giá trị, do đó nó không thể bằng =hoặc không bằng !=bất cứ điều gì. Nó không phải là giống như zero 0đó một giá trị.

A NULLchỉ ra rằng không có giá trị nào được ghi lại trong ô bạn đang xem. Để kiểm tra nếu một giá trị tồn tại, bạn hỏi nếu ô IS NULLhoặc nếu nóIS NOT NULL

  • IS NULL kiểm tra xem ô trống
  • IS NOT NULL kiểm tra xem ô có trống không

Nếu bạn có một số hồ sơ, nơi một giá trị One, Two, Threevà phần còn lại NULLvà bạn muốn tìm tất cả những gì không Twobạn sẽ cần phải sử dụng một cái gì đó như

value != 'Two' OR value IS NULL

vì các giá trị NULL không được trả về trong một truy vấn bằng / không bằng. Nếu bạn chỉ sử dụng value != 'Three'kết quả sẽ loại trừ tất cả các NULLbản ghi NULLlà không có giá trị có thể bằng hoặc không bằng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.