2012-04-18 1 views
12

2 개의 null 허용 CHAR 열이 있는데 중 하나만 인지 확인해야합니다. 이렇게nullable 값에 대한 까다로운 논리적 XOR

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

지루하다. 그리고 나는 그것을 위해 맞춤 함수를 만드는 것을 피하고 싶습니다.

내가

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

하지만 한 achar처럼 뭔가에 대해 생각되었다 -는 피연산자 유형의 오류가 발생합니다.

그럼 까다로운 솔루션입니까?

+2

어떻게 COALESCE (A, B) = COALESCE는 (B, A) ': 잘못된 값을 얻을 것인가'에 대한 경우'A = b'. http://www.sqlfiddle.com/#!1/9c33b/1 – mellamokb

+0

@mellamokb : '선택 병합 (null, null) = 병합 (null, null)'은 불리언 값을 반환하지 않습니다. 오류가있는 경우도 있습니다.) – zerkms

답변

25

당신이 의미하는 경우 정확히 하나는, (기존의 논리와 일치하는) NULL입니다 :

a is null != b is null 
+2

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

+0

놀랍게도 매우 간단했습니다 :-) – zerkms

+0

@zerkms : 두 번 확인 했으므로 빠른 삭제/삭제 취소 : –

7

그리고 당신은 괄호를 잊지 마세요 PostgreSQL의를 사용하는 경우 ...

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

(나는 내 ​​CHECK 잘못 무엇인지 이해하려고 노력 약 10 분 소요.)