Asakusa Framework Advent Calendar 2019の11日目、SQLをAsakusaFWに変換するポイントについてです。
SELECT・UPDATEやDELETE文のWHERE条件は、基本的にBranch演算子で実現できます。
基本的にと言うのは、入力レコードのみで判断できるものを指しています。
そして、そうでないものとは、別レコードとの結合を必要とするもの、すなわちSQLのexistsやin-selectです。
col in (select c from t)という形式はexists (select 1 from t where c = col)に置き換えられるので、実質同じです。
そして、existsはMasterCheck演算子で実現することが出来ます。
ただし、null同士の比較がありうるのであれば、そのままでは出来ません。一番簡単な解決策は、マスター側のnullデータを事前に別の値に更新しておくことでしょうか。そうすればnullとその値の比較はマッチしないので、SQLと同じ結果になります。
あと、existsのwhereに等値「=」以外の比較がある場合は、MasterSelectionで実現できると思います。