MySQL: chọn các hàng trong đó một cột là null


270

Tôi gặp vấn đề khi tôi cố gắng chọn các hàng có NULL cho một cột nhất định, nó sẽ trả về một tập hợp trống. Tuy nhiên, khi tôi nhìn vào bảng trong phpMyAdmin, nó nói null cho hầu hết các hàng.

Truy vấn của tôi trông giống như thế này:

SELECT pid FROM planets WHERE userid = NULL

Đặt trống mỗi lần.

Rất nhiều nơi nói để đảm bảo rằng nó không được lưu trữ dưới dạng "NULL" hoặc "null" thay vì giá trị thực tế và một nơi được cho là cố gắng tìm kiếm một khoảng trắng ( userid = ' 'nhưng không có cái nào trong số này hoạt động. Có một đề nghị không sử dụng MyISAM và sử dụng innoDB vì MyISAM gặp sự cố khi lưu trữ null. Tôi đã chuyển bảng sang innoDB nhưng bây giờ tôi cảm thấy vấn đề có thể là nó vẫn không thực sự là null vì cách nó có thể chuyển đổi nó. Tôi muốn làm điều này mà không phải tạo lại bảng dưới dạng innoDB hoặc bất cứ điều gì khác, nhưng nếu tôi phải làm, tôi chắc chắn có thể thử nó.


1
MyISAM không gặp khó khăn khi lưu trữ null. Các ngữ nghĩa của bản thân NULL phải độc lập với động cơ.
MarkR

Câu trả lời:


512

SQL NULL đặc biệt và bạn phải làm WHERE field IS NULL, vì NULL không thể bằng bất cứ thứ gì,

bao gồm chính nó (tức là: NULL = NULL luôn luôn sai).

Xem Rule 3 https://en.wikipedia.org/wiki/Codd%27s_12_rules


24
Không rõ - Không sai. SQL sử dụng ba logic có giá trị.
Martin Smith

38
NULL = NULL không thực sự là FALSE - lại là NULL. Nhưng nó cũng không đúng, vì vậy IF (NULL = NULL) sẽ không thực thi.
Konerak

1
xem thêm @obe trả lời: CHỌN 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0
Thomas

Không chỉ là không bằng bất cứ điều gì, nó cũng không - không bằng bất cứ điều gì. Nói cách khác, select * from foo where bar <> "abc"sẽ không trả về các hàng trong đó thanh là null. Điều đó đã ném tôi cho một vòng lặp ngày hôm nay. Các tài liệu gọi <>toán tử "không bằng", nhưng thực sự đó là toán tử "bằng với toán tử khác".
StackOverthrow


39

Vì tất cả đều được đưa ra câu trả lời, tôi muốn thêm ít hơn. Tôi cũng đã phải đối mặt với vấn đề tương tự.

Tại sao truy vấn của bạn thất bại? Bạn có,

SELECT pid FROM planets WHERE userid = NULL;

Điều này sẽ không cung cấp cho bạn kết quả mong đợi, bởi vì tài liệu mysql

Trong SQL, giá trị NULL không bao giờ đúng so với bất kỳ giá trị nào khác, ngay cả NULL. Một biểu thức có chứa NULL luôn tạo ra một giá trị NULL trừ khi có quy định khác trong tài liệu cho các toán tử và các hàm liên quan đến biểu thức.

Nhấn mạnh mỏ.

Để tìm kiếm các giá trị cột NULL, bạn không thể sử dụng một expr = NULLbài kiểm tra. Câu lệnh sau không trả về hàng nào, vì expr = NULLkhông bao giờ đúng với bất kỳ biểu thức nào

Giải pháp

SELECT pid FROM planets WHERE userid IS NULL; 

Để kiểm tra NULL, sử dụng IS NULLvà các IS NOT NULLtoán tử.



11

Thông tin từ http://w3schools.com/sql/sql_null_values.asp :

1) Giá trị NULL thể hiện dữ liệu chưa biết.

2) Theo mặc định, một cột bảng có thể chứa các giá trị NULL.

3) Giá trị NULL được xử lý khác với các giá trị khác

4) Không thể so sánh NULL và 0; chúng không tương đương

5) Không thể kiểm tra các giá trị NULL bằng các toán tử so sánh, chẳng hạn như =, <hoặc <>.

6) Thay vào đó, chúng ta sẽ phải sử dụng các toán tử IS NULL và IS NOT NULL

Vì vậy, trong trường hợp vấn đề của bạn:

SELECT pid FROM planets WHERE userid IS NULL

7

Có cùng một vấn đề trong đó truy vấn:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

trả lại không có giá trị. Có vẻ như là một vấn đề với MyISAM và cùng một truy vấn về dữ liệu trong InnoDB đã trả về kết quả mong đợi.

Đi với:

SELECT * FROM 'column' WHERE 'column' = ' '; 

Trả lại tất cả các kết quả mong đợi.



0

Tôi gặp vấn đề tương tự khi chuyển đổi cơ sở dữ liệu từ Access sang MySQL (sử dụng vb.net để liên lạc với cơ sở dữ liệu).

Tôi cần phải đánh giá xem một trường (varchar loại trường (1)) là null.

Tuyên bố này đã làm việc cho kịch bản của tôi:

SELECT * FROM [table name] WHERE [field name] = ''

1
Nếu điều đó làm việc cho bạn, mặc định cho varchar của bạn (1) là '' chứ không phải null, do đó không liên quan đến câu hỏi này.
さ り げ
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.