2012-02-01 21 views
7

Với bảng sau:Làm thế nào để làm cho công việc = NULL trong SQLite?

 
Table: Comedians 
================= 

Id First Middle Last 
--- ------- -------- ------- 
1  Bob  NULL  Sagat 
2 Jerry  Kal  Seinfeld  

Tôi muốn làm cho các truy vấn chuẩn bị sau:

 
SELECT * FROM Comedians WHERE Middle=? 

làm việc cho tất cả các trường hợp. Nó hiện không hoạt động cho trường hợp tôi vượt qua NULL qua sqlite3_bind_null. Tôi nhận ra rằng các truy vấn để thực sự tìm kiếm các giá trị NULL sử dụng IS NULL, nhưng điều đó có nghĩa là tôi không thể sử dụng truy vấn đã chuẩn bị cho tất cả các trường hợp. Tôi thực sự sẽ phải thay đổi truy vấn tùy thuộc vào đầu vào, phần lớn sẽ đánh bại mục đích của truy vấn đã chuẩn bị. Làm thế nào để tôi làm điều này? Cảm ơn!

+0

Làm thế nào sẽ tìm kiếm người dùng cho một diễn viên hài không có tên đệm? – Mithrandir

+0

@Mithrandir Đây không phải là chức năng hướng đến người dùng, nó được sử dụng nội bộ. Về cơ bản, tôi chuyển một con trỏ (char *) cho hàm. Nếu con trỏ là NULL, tôi sử dụng 'sqlite3_bind_null' nhưng nếu nó là chuỗi 'NULL' thì tôi sử dụng hàm chuỗi. – chacham15

Trả lời

7

Bạn có thể sử dụng IS operator thay vì =.

SELECT * FROM Comedians WHERE Middle IS ? 
+2

damn, là chỉ có trên SQLite? Điều đó sẽ rất hữu ích đối với các SQL khác ... – dotjoe

+0

tuyệt vời! Chỉ cần những gì tôi đang tìm kiếm! – chacham15

+2

@dotje: Trong PostgreSQL bạn có thể sử dụng 'một KHÔNG PHẢI TỪ CHỐI b'. Hơi đắt hơn 'a = b'. –

4

Không có gì khớp với = NULL. Cách duy nhất để kiểm tra đó là với IS NULL.

Bạn có thể làm nhiều điều, nhưng là một thẳng về phía trước ...

WHERE 
    middle = ? 
    OR (middle IS NULL and ? IS NULL) 

Nếu có một giá trị mà bạn biết không bao giờ xuất hiện, bạn có thể thay đổi điều đó để ...

WHERE 
    COALESCE(middle, '-') = COALESCE(?, '-') 

Nhưng bạn cần giá trị nghĩa là KHÔNG BAO GIỜ xuất hiện. Ngoài ra, nó obfuscates việc sử dụng các chỉ mục, nhưng phiên bản OR thường có thể hút là tốt (tôi không biết làm thế nào cũng SQLite xử lý nó).

Mọi thứ đều bằng nhau, tôi khuyên bạn nên sử dụng phiên bản đầu tiên.

2

NULL không phải là giá trị mà là thuộc tính của trường. Thay vì sử dụng

SELECT * FROM Comedians WHERE Middle IS NULL 
+0

đây không phải là một giải pháp chung vì nó không cho phép tôi kiểm tra sự bình đẳng với một cái gì đó khác với null – chacham15

+0

@ chacham15: Không có giải pháp chung nào sử dụng NULL, vì nó không phải là một giá trị. Có lẽ bạn nên sử dụng [giá trị sentinel] (http://en.wikipedia.org/wiki/Sentinel_value) để thay thế. – wallyk

+0

xem câu trả lời được chấp nhận – chacham15

0

Nếu bạn muốn phù hợp với tất cả mọi thứ trên NULL

SELECT * FROM Comedians WHERE Middle=IfNull(?, Middle) 

nếu muốn phù hợp với không về NULL

SELECT * FROM Comedians WHERE Middle=IfNull(?, 'DUMMY'+Middle) 

Xem câu trả lời này: https://stackoverflow.com/a/799406/30225

Các vấn đề liên quan