postgresqlはリレーショナル・データベースなのにXORとNANDが使えない。
ので、オペレータを定義した。
sql(XOR)
CREATE FUNCTION xor(bool,bool) RETURNS bool AS '
SELECT ($1 AND NOT $2) OR (NOT $1 AND $2);
' LANGUAGE 'sql';
CREATE OPERATOR ~| (PROCEDURE='xor',LEFTARG=bool,RIGHTARG=bool);
http://snowland.net/nucleus/item/738 の丸パクリ。
sql(NAND)
CREATE FUNCTION nand(bool,bool) RETURNS bool AS '
SELECT NOT ($1 AND $2);
' LANGUAGE 'sql';
CREATE OPERATOR ^& (PROCEDURE='nand',LEFTARG=bool,RIGHTARG=bool);
こんな感じで使う。
sql(sample)
-- yoshikiとtoshiのいずれか
SELECT * FROM xjapan WHERE yoshiki ~| toshi;
--pataでない、かつhideでない
SELECT * FROM xjapan WHERE pata ~| hide;
追記
こちらの方法の方がスマートである。。
http://cs.hatenablog.jp/entry/2013/07/19/154215