SQL製品別・XORと同値の書き方
SQLにブール型が定義されたのはSQL99と比較的最近のことなので、ブール型への対応にはまだばらつきがあります。
- Oracle(12c), PostgreSQL(9.x) … 対応
- SQL Server(2012), MySQL(5.x) … 非対応。1ビット整数のBIT型を代わりに持つ。
XOR(両辺の論理式のうち、片方だけが成立する)や同値(両辺の論理式が、ともに成立かともに不成立)という条件式を書きたいとき、ブール型に対応するOracleやPostgreSQLでは簡単です。
(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)
MySQLはXOR
だけ持っています。では同値をどう書くか?
(a=0) XOR NOT (b IS NULL) (c<d) XOR (e<f)
NOT
と組み合わせることで実現できます。