リレーショナルデータベースのUNIONの実装で条件文のOR演算を実現

データベースの勉強に、かわいいデータベースを実装していたら、だいぶかわいさがなくなってきました。
http://d.hatena.ne.jp/nowokay/20120817#1345197962


ところで、先日、「UNIONの実装はどう?」というコメントに「実際に使わないから乗り気しない」みたいなこと書いたのです。
http://d.hatena.ne.jp/nowokay/20120821#c


実際、SQLでUNIONを使うことは、そこまで多くないと思います。
でも、よく考えると、直接UNIONを使うことはなくても、インデックスが使える条件のORでは、内部的にUNIONが使われることも多いわけです。


ということで、UNION実装してみました。あと、OR演算で面白い結果が出せるように、BETWEENも実装しました。
それと、DISTINCTを実現するために、各タプルにoidをつけるようにしています。


次のようにしてUNIONができます。

System.out.println(Query
        .from("shohin").between("price", 100, 150)
        .union(Query
        .from("shohin").between("price", 250, 300), true));

こんな感じで、「(price between 100 and 150) or (price between 250 and 300)」という条件式での抽出になっています。

 |shohin.shohin_id|shohin.shohin_name|shohin.kubun_id|shohin.price|
 |2|みかん|1|130|
 |5|わかめ|null|250|
 |1|りんご|1|300|

unionメソッドの2番目の引数はDISTINCT指定です。

続きを読む