Chonaso's Commentary

InternetやIT技術などについて知ったこと、試したこと、考えたことを書いていきます。

nullを許容する2Way-SQL

別に意図したわけじゃないんですが、長い文章の記事しか書いてないせいで記事を書くハードルがやたら上がってしまっているので短い記事を増やしてハードルを下げようかと思います。

というわけで、最近Domaを使ったアプリのコーディングにちょっとだけ参加しているのでその辺の出来事。

例えばこういうテーブルで、

create table log(
id varchar(16),
status varchar(1),
value text
) 

statusを複数種類の値でマッチするselectを書きたい場合、通常であればリストか配列を渡せば自動的にwhere inにしてくれるんだけど、nullも許容できるようにする際には当然where inにはできないので結構複雑な2WaySQLになってしまいました。

select
  id,
  status,
  value
from
  log
where
/*%for st : statusList */
  /*%if st==null */
    status is null
    /*%if st_has_next */
      or
    /*%end */
  /*%else*/
    status = /* st */'1'
    /*%if st_has_next */
      /*# "or" */
    /*%end */
  /*%end */
/*%end*/

ぶっちゃけ、ドメイン設計がイケてない気がしてます。

他のソリューションとしては、

  • 決まった検索条件であれば固定のSQLにする
    • バインド処理をしない分シンプルかつ高速になる(気がする)
    • メソッドで意味を定義するのはDomaらしくない感じがするのは自分だけ?
  • そもそもnullを許容しない
    • たぶんこれが正解ですね