2009-04-29 16 views
7

Trong Mysql có toán tử so sánh là an toàn không: < =>. Tôi sử dụng điều này trong chương trình Java của tôi khi tạo các câu lệnh đã chuẩn bị như sau:Làm thế nào để viết một an toàn null so sánh "<=>" trong SQL thuần túy?

String routerAddress = getSomeValue(); 
String sql = "SELECT * FROM ROUTERS WHERE ROUTER_ADDRESS <=> ? "; 
PreparedStatement stmt = connection.prepareStatement(sql); 
stmt.setString(1, routerAddress); 

Bây giờ tôi muốn chuyển sang cơ sở dữ liệu H2. Làm cách nào để viết toán tử < => trong SQL thuần túy (sử dụng ví dụ IS NULL và IS NOT NULL)? Tôi chỉ muốn sử dụng thao tác stmt.setString chỉ sau khi. Bạn có thể viết tên cột nhiều lần.

Câu hỏi liên quan là Get null == null in SQL. Nhưng câu trả lời đó đòi hỏi giá trị tìm kiếm phải được viết 2 lần (nghĩa là: 2 dấu chấm hỏi trong PreparedStatement của tôi) !?

tham khảo: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

+0

Không chắc chắn rằng tôi hoàn toàn hiểu những gì bạn muốn làm. Bạn có muốn tuyên bố có thể trả lại các hàng khi bạn khớp ROUTER_ADDRESS trên tham số không null mà bạn chuyển vào và trả về các hàng có ROUTER_ADDRESS là null khi bạn chuyển vào null không? –

+0

Vâng, đó chính xác là nó! GetSomeValue() của tôi có thể trả về cả giá trị null và không null. Khi nó trả về null, tôi muốn tất cả các hàng mà ROUTER_ADDRESS là null. –

+0

Trong SQL thuần túy (= tiêu chuẩn) sẽ là 'a khác biệt với b' –

Trả lời

9

câu hỏi liên quan là Get rỗng == null trong SQL. Nhưng câu trả lời đó đòi hỏi giá trị tìm kiếm phải được viết 2 lần (nghĩa là: 2 dấu chấm hỏi trong PreparedStatement của tôi) !?

Thứ hai xếp hạng và câu trả lời tiếp theo cho một phương pháp để làm điều này mà không ràng buộc giá trị tìm kiếm hai lần:

SELECT * FROM ROUTERS 
WHERE coalesce(ROUTER_ADDRESS, '') = coalesce(?, ''); 

Lưu ý rằng điều này đòi hỏi một giá trị giả mà không bao giờ có thể được giá trị cột hợp lệ (đó là " ngoài băng "); Tôi đang sử dụng chuỗi rỗng. Nếu bạn không có bất kỳ giá trị nào như vậy, bạn sẽ phải kết thúc giá trị hai lần:

SELECT * FROM ROUTERS 
WHERE ROUTER_ADDRESS = ? or (ROUTER_ADDRESS is null and ? is null); 
1

Trong SQL, NULL không bằng chính nó. Vì vậy, bạn có thể:

1 - Thay thế nó bằng một giá trị giả và so sánh những, như trong:

SELECT * FROM ROUTERS WHERE ISNULL(ROUTER_ADDRESS,'xxx') <=> ISNULL(?,'xxx') 

hoặc

2 - Thay thế nó với một bài kiểm tra logic phức tạp hơn, như trong:

SELECT * 
FROM ROUTERS 
WHERE (
     (ROUTER_ADDRESS IS NULL AND ? IS NOT NULL) 
     OR 
     (ROUTER_ADDRESS IS NOT NULL AND ? IS NULL) 
     OR 
     (ROUTER_ADDRESS IS NOT NULL AND ? IS NOT NULL AND ROUTER_ADDRESS <> ? 
    ) 
0

Nếu bạn muốn ROUTERS nơi ROUTER_ADDRESS là rỗng khi nào? là null sau đó có thể là điều này có thể làm việc:

SELECT * 
FROM ROUTERS 
WHERE ROUTER_ADDRESS = (case when ROUTER_ADDRESS is null and ? is null then null 
          else ? end) 
6

Các NULL an toàn khai thác bình đẳng tiêu chuẩn trong SQL là IS DISTINCT FROMIS NOT DISTINCT FROM.

+2

H2 bây giờ cũng hỗ trợ cú pháp này. Và nó hỗ trợ cú pháp (ngắn hơn nhưng không chuẩn) 'x IS y' và' x IS NOT y'. –

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