プログラミング言語SML#解説 3.7.1版
22 SQL式とコマンド

22.9 SQLライブラリ:SQL.Opストラクチャ

SQL.Opストラクチャは, SQL評価式の中で用いる SQLの二項演算子や集約関数,およびその他のユーティリティーを 提供する. SQL評価式構文の中では, いくつかの識別子が以下の通りinfix宣言される.

infix 7 %
infix 5 like ||
nonfix mod

SML#で評価される式でないSQL評価式構文内では, このストラクチャで定義されている関数や演算子を ストラクチャ名を前置することなく使用することができる.

SQL.Opストラクチャで定義されている関数の多くは, 複数のSQL基本型(22.1節参照)に対して オーバーロードされている. 本節では,説明の便宜上, オーバーロードされている型とその動く範囲を, 以下の型変数の名前で示す.

  • ’sqlは全てのSQL基本型およびそのoption型を動く.

  • ’sqloptは全てのSQL基本型のoption型を動く.

  • ’numはSQL基本型のうち数値型およびそのoption型を動く.

  • ’strstring型およびstring option型のどちらかを動く.

  • これら以外の型変数は,通常通り,任意の型を動く.

SQL.Opストラクチャのシグネチャは以下の通りである.

structure SQL : sig
  
  structure Op : sig
    val Some : ’a -> ’a option
    val Part : ’a option list -> ’a list
    val Num : ’num -> numeric option
    val + : ’num * ’num -> ’num
    val - : ’num * ’num -> ’num
    val * : ’num * ’num -> ’num
    val / : ’num * ’num -> ’num
    val mod : ’num * ’num -> ’num
    val ~: ’num -> ’num
    val abs : ’num -> ’num
    val < : ’sql * ’sql -> bool3
    val > : ’sql * ’sql -> bool3
    val <= : ’sql * ’sql -> bool3
    val >= : ’sql * ’sql -> bool3
    val = : ’sql * ’sql -> bool3
    val <> : ’sql * ’sql -> bool3
    val || : ’str * ’str -> ’str
    val like : ’str * ’str -> bool3
    val nullif : ’sqlopt * ’sqlopt -> ’sqlopt
    val coalesce : ’b option * ’b -> ’b
    val coalesce’ : ’b option * ’b option -> ’b option
    val count : ’sql list -> int
    val avg : ’num list -> numeric option
    val sum : ’num list -> ’num option
    val sum’ : ’num option list -> ’num option
    val min : ’sql list -> ’sql option
    val min’ : ’sql option list -> ’sql option
    val max : ’sql list -> ’sql option
    val max’ : ’sql option list -> ’sql option
  end
end

以下, これらの定義を役割ごとに副節に分けて説明する.

22.9.1 型を合わせるための何もしない関数

SML#がサポートしない 暗黙のキャストやオーバーロードに対応するため, 型の辻褄を合わせるための以下の関数が提供されている. これらの使い方は 22.4.5節を参照せよ.

  • val Some : ’a -> ’a option

  • val Part : ’a option list -> ’a list

  • val Num : ’num -> numeric option

22.9.2 SQL演算子および関数

SQL.Opストラクチャは以下の二項演算子を提供する. これらの演算子は, 引数に取るSQL評価式に同名の演算子を加えたSQL評価式を返す. 演算子式はクエリがサーバーに送信されるまで評価されない.

  • 比較演算子: 5種類の比較演算子 <, >, <=, >=, =, <>が 全てのSQL基本型に対してオーバーロードされている. これらの比較演算子の型は,

    ’sql * ’sql -> bool3

    である.

  • 算術演算子: 4種類の二項演算子 +, -, *, /, % および2つの単項演算子 ~, absが 全てのSQLの数値型に対してオーバーロードされている. SQL評価式の中では,識別子%はinfixと宣言される. これらの型は,

    ’num * ’num -> ’num

    または

    ’num -> ’num

    である.

  • 剰余演算: 剰余演算子modは,標準SQLに合わせ, 二項演算子ではなく関数としても提供されている. 接続先のデータベースによっては, mod%のどちらか片方しかサポートしていないことに 注意すること. SQL評価式の中では,識別子modはnonfixと宣言される. modの型は,

    ’num * ’num -> ’num

    である.

  • 文字列演算子: パターンマッチ演算子likeと 結合演算子||が使用できる. どちらの識別子も SQL評価式の中ではinfix宣言されている. これらの型は以下の通りである.

    val like : ’str * ’str -> bool3
    val || : ’str * ’str -> ’str

  • NULLIF: 以下の型のnullif関数が提供されている.

    val nullif : ’sqlopt * ’sqlopt -> ’sqlopt

    引数は2つともoption型でなければならない. 適宜Someで型を合わせること.

  • COALESCE: option型の取り扱いの違いで, coalescecoalesce’の2つの関数が提供されている.

    val coalesce : ’b option * ’b -> ’b
    val coalesce’ : ’b option * ’b option -> ’b option

    どちらの関数を用いても, サーバーに送信される関数名はCOALESCEである. coalesceの型は, NULLをNULLでない値で置き換える使い方に合わせて決めている. 標準SQLとは異なり,3つ以上の引数はサポートしていない. 3つ以上の値を取り扱うときはcoalesce’関数をネストすること.

22.9.3 SQL集約関数

5つの標準SQLの集約関数 countavgsumminmaxが 利用可能である. このうち, summinmax関数は, option型の取り扱いの違いにより, 2種類の関数(例えばsumsum’)が提供されている. どちらの関数を用いても, サーバーに送信される関数名は同じである.

これらの関数の型は以下の通りである.

val count : ’sql list -> int
val avg : ’num list -> numeric option
val sum : ’num list -> ’num option
val sum’ : ’num option list -> ’num option
val min : ’sql list -> ’sql option
val min’ : ’sql option list -> ’sql option
val max : ’sql list -> ’sql option
val max’ : ’sql option list -> ’sql option