2013-04-26 15 views
17

Tôi chỉ tò mò thôi. Tôi biết về NULL điều hành bình đẳng an toàn < =>, nhưng là có một số NULL an toàn vận hành bằng KHÔNG, hoặc tôi phải luôn luôn sử dụng một cái gì đó như thế:MySQL - NULL an toàn KHÔNG bằng toán tử

(tab.id != 1 OR tab.id IS NULL) 

hoặc một người nào đó thích

!(tab.id <=> 1) 

Trả lời

7
COALESCE(tab.id, 0) != 1 

Có thể sử dụng ở đây nếu bạn thích. Tôi đi qua các tham số và trả về giá trị đầu tiên không phải là NULL. Trong trường hợp này nếu là NULL, nó sẽ so sánh 0 != 1. Mặc dù nó có thể sử dụng nhiều dấu hiệu hơn, nó vẫn dễ quản lý hơn thay vì bị buộc phải luôn luôn đối nghịch với "các phép toán" như một giải pháp trong những trường hợp đó.

đọc tài liệu cho COALESCE()

+0

Tôi nghĩ rằng đây là phương pháp ưa thích vì truy vấn này cũng sẽ hoạt động trên SQL Server. Phương pháp tốt nhất là không có các giá trị rỗng và có một giá trị mặc định thích hợp, nhưng dữ liệu nguồn không phải lúc nào cũng được kiểm soát bởi nhà phát triển. –

+3

Thật không may nếu bạn không biết giá trị trên RHS của so sánh này, bạn không biết những gì để COALESCE() NULL của bạn! – Arth

+0

Công trình này hoạt động nếu bạn muốn so sánh tab.id với một giá trị nhưng nó không hoạt động nếu bạn muốn so sánh hai trường như tab.id với tab_childs.tab_id. –

8

tôi thấy rằng NOT (NULL < => 1) hoạt động và tôi nghĩ rằng nó cũng là tiêu chuẩn ISO tuân thủ, nhưng là cồng kềnh. Một cách tốt hơn để hiển thị sử dụng tên cột sẽ là như thế này: NOT (tbl.col1 < => 1)

+2

'<=>' không phải là tiêu chuẩn SQL, nó là một phần mở rộng MySQL. So sánh tiêu chuẩn tương đương null-an toàn là, thường cho SQL, nhiều chi tiết hơn: 'IS [NOT] DISTINCT FROM'. –

0

Nếu bạn biết rằng RHS của sự so sánh IS NOT NULL:

COALESCE(tab.id != 1, 1) 

Hoặc

COALESCE(tab.id != 1, TRUE) 

sẽ cho bạn kết quả chính xác.

Cho dù điều này là tốt hơn có thể đọc được nhiều hơn:

(tab.id != 1 OR tab.id IS NULL) 

là gây tranh cãi ..

Tôi cũng bị cám dỗ để lọc ra logic NULL đầu tiên với so sánh, vì vậy tôi không cần phải hãy nghĩ về chúng! Tôi có thể viết phương trình đầu tiên của bạn là:

(tab.id IS NULL OR tab.id != 1) 

Hiệu suất sẽ phụ thuộc vào tỷ lệ hiện tại là NULL s.

1

Bây giờ MySQL không có không bằng hành NULL-an toàn.

Sử dụng MySQL giải pháp phổ biến nhất là:

!(tab.id <=> 1) 

hoặc

NOT tab.id <=> 1 

bởi vì nó sẽ hoạt động đúng nếu ngay cả ở vị trí của 1 bạn sẽ sử dụng NULL.