ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

SQL to AsakusaFW:WHERE(1)

2019-12-10 00:00:00 | PG(分散処理)

Asakusa Framework Advent Calendar 2019の10日目、SQLをAsakusaFWに変換するポイントについてです。

SELECT・UPDATEやDELETE文のWHERE条件は、基本的にBranch演算子で実現できます。
SELECTの場合は条件を満たしたものだけ抽出、DELETEは逆に条件を満たしたものは出力しない。UPDATEは条件を満たしたものだけ更新し、満たさなかったものと後で合流(core.confluent演算子)します。

ここで重要なのは、NULLの扱いです。
SQLではNULLとの比較演算の結果はUNKNOWNとなり、UNKNOWNはFALSE扱いです。
例えば等値演算「a=b」の場合、AsakusaFWのオペレーターではa.equals(b)となるわけですが、aもbもNULLの場合、SQLはUNKNOWNすなわちFALSEになるのに対し、AsakusaFWではtrue(null同士なので等しい)になります。
(aかbのどちらかのみがNULLの場合は、SQLの「a=b」はUNKNOWNでFALSE扱いとなり、AsakusaFWでは単純に不一致でfalseとなるので、結果は一致します)
なので、AsakusaFWではSQL用の演算を行うユーティリティーを作り、それを呼び出すようにした方が良いと思います。

それでもさらに問題があって、それは否定演算NOTです。
SQLでは「NOT(a=b)」に対してaかbがNULLの場合、「NOT UNKNWON」→「UNKOWN」→「FALSE扱い」となります。なので、AsakusaFWに変換するときはNOTは要注意。単純にJavaの否定演算子「!」を使えばいいというわけにはいきません。
このSQLの「3値Boolean」をJavaで厳密に扱うなら、専用のクラスを作るべきかもしれません…。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする