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型を動く.
-
•
’strはstring型および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型の取り扱いの違いで, coalesceとcoalesce’の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の集約関数 count, avg, sum, min, maxが 利用可能である. このうち, sum,min,max関数は, option型の取り扱いの違いにより, 2種類の関数(例えばsumとsum’)が提供されている. どちらの関数を用いても, サーバーに送信される関数名は同じである.
これらの関数の型は以下の通りである.
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