2012-04-18 12 views
12

Tôi có 2 cột không có giá trị CHAR và tôi cần kiểm tra xem chỉ một trong số chúng là không.XOR lôgic hợp lý cho các giá trị có thể vô hiệu

Làm

(a IS NULL AND b IS NOT NULL) OR (a IS NOT NULL AND b IS NULL) 

là nhàm chán. Và tôi muốn tránh tạo các chức năng tùy chỉnh cho điều đó.

Tôi đã suy nghĩ về một cái gì đó giống như

COALESCE(a, 1) + COALESCE(b, 1) = 1 

nhưng miễn là achar - nó gây ra loại toán hạng lỗi.

Vì vậy, bất kỳ giải pháp nào khó khăn?

+2

Làm thế nào về 'COALESCE (a, b) = COALESCE (b, a)' :) Sẽ mang lại giá trị không chính xác nếu 'a = b'. http://www.sqlfiddle.com/#!1/9c33b/1 – mellamokb

+0

@mellamokb: xứng đáng là một upvote, mặc dù 'chọn coalesce (null, null) = coalesce (null, null)' trả về không boolean (có thể dẫn đến lỗi trong một số trường hợp) – zerkms

Trả lời

25

Nếu bạn có ý nghĩa chính xác một là NULL (mà phù hợp với luận lý hiện tại của bạn), sau đó:

a is null != b is null 
+2

+1 http://www.sqlfiddle.com/#!1/5199b/2 – mellamokb

+0

Ngạc nhiên quá đơn giản :-) – zerkms

+0

@zerkms: Tôi phải kiểm tra lại nó, do đó xóa nhanh/undelete :) –

7

Và nếu bạn đang sử dụng PostgreSQL đừng quên ngoặc ...

ALTER TABLE "schema"."table" ADD CHECK ((key1 IS NULL) <> (key2 IS NULL)); 

(Tôi đã dành gần 10 phút để hiểu những gì đã xảy ra với KIỂM TRA của tôi.)

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