2012-04-18 2 views
12

У меня есть 2 нулевых столбца CHAR, и мне нужно проверить, только один из них имеет значение null.Tricky логический 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 

, но до тех пор, как a является char - это вызывает ошибку типа операнда.

Итак, любые сложно решить? решений?

+2

Как насчет 'COALESCE (а, Ь) = COALESCE (Ь, а)' :) Будет давать неверное значение, если 'а = b'. http://www.sqlfiddle.com/#!1/9c33b/1 – mellamokb

+0

@mellamokb: заслуживает upvote, хотя 'select coalesce (null, null) = coalesce (null, null)' возвращает not boolean (что может привести к ошибки в некоторых случаях) – zerkms

ответ

25

Если вы имеете в виду точно один является NULL (что соответствует существующей логике), то:

a is null != b is null 
+2

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

+0

Удивленный это было так просто :-) – zerkms

+0

@zerkms: Мне пришлось дважды проверить его, следовательно, быстрое удаление/undelete :) –

7

И если вы используете PostgreSQL не забудьте скобки ...

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

(я провел почти 10 минут, пытаясь понять, что случилось с моим CHECK.)