C Sharpens you up

http://qiita.com/yuba に移しつつあります

SQL製品別・XORと同値の書き方

SQLにブール型が定義されたのはSQL99と比較的最近のことなので、ブール型への対応にはまだばらつきがあります。

XOR(両辺の論理式のうち、片方だけが成立する)や同値(両辺の論理式が、ともに成立かともに不成立)という条件式を書きたいとき、ブール型に対応するOraclePostgreSQLでは簡単です。

(a=0) = (b IS NULL)
(c<d) <> (e<f)

のように、=, <>演算子がそのまま同値とXORを意味します。

SQL Serverの場合、論理式の真偽とBIT型とはまた別なので、=, <>演算子というわけにいきません。なんと条件式はAND, OR, NOT演算子だけで書き下ろさねばなりません。

(a=0 AND b IS NULL) OR (NOT a=0 AND NOT b IS NULL)
(NOT c<d AND e<f) OR (c<d AND NOT e<f)

MySQLXORだけ持っています。では同値をどう書くか?

(a=0) XOR NOT (b IS NULL)
(c<d) XOR (e<f)

NOTと組み合わせることで実現できます。