====== 拡張SQL ======
ACFinder では、[[https://www.sqlite.org/|SQLite3]] をより便利に使うために、SQLite3 の SQL を拡張しています。
機能拡張の方法として、SQLite データベースエンジンに関数・演算子を組み込むビルトイン関数と、SQLite データベースエンジンに SQL を渡す前に ACFinder 側で処理するプリプロセッサ関数があります。
===== match 演算子 (ビルトイン) =====
「大文字/小文字」「ひらがな/カタカナ」「全角/半角」の違い及び「表記の揺れ」を全て同一視する、like 類似演算子です((SQLite3 では match 演算子の実装はユーザに任せられているので、SQLite3 を使った他のシステムの match 演算子が同じ機能を持つとは限りません))。1文字ワイルドカードの '_' に対応していないことを除き、下記のように使い方は like 演算子と全く同じです。左辺の expr は式ですが、一般的にはフィールド名を記述します。
完全一致: expr MATCH 'pattern'
前方一致: expr MATCH 'pattern%'
後方一致: expr MATCH '%pattern'
部分一致: expr MATCH '%pattern%'
同一視したくない文字種がある場合は、match 関数を使用してください。option パラメータは省略可能で、省略した場合は 'ckwv' が指定されたと見なします((match('pattern', expr) と match('pattern', expr, 'ckwv') は等価))。このため、match('pattern', expr) と %%match('pattern', expr, '')%% は意味が異なり、 %%match('pattern', expr, '')%% は使用する意味がないので、高速な like 演算子を使用してください。\\
なお、match 演算子は、内部で match('pattern', expr) に展開されます。
MATCH('[%]pattern[%]', expr[, 'option'])
option
c: 大文字/小文字の違いを同一視する
k: ひらがな/カタカナの違いを同一視する
w: 全角/半角の違いを同一視する
v: 濁音、半濁音、長音、拗音、促音などの表記の揺れを同一視する
ACFinder 080921 版以降では、'k' を指定すると 'kw' と同じ意味になります。
===== regexp 演算子 (ビルトイン) =====
[[http://www.kt.rim.or.jp/~kbk/regex/regex.html|Perl 5.8 互換の正規表現]]でパターンマッチング可能な、like 類似演算子です。下記のような式で、pattern に正規表現を記述します。左辺の expr は式ですが、一般的にはフィールド名を記述します。
expr REGEXP 'pattern'
Perl 5.8 互換といっても、修飾子(modifier)は使えません。その代わり独自拡張として、「大文字/小文字」「ひらがな/カタカナ」「全角/半角」の違い及び「表記の揺れ」を全て同一視するようになっています。
同一視したくない文字種がある場合は、regexp 関数を使用してください。書式及び option の意味は match 関数と同じです。全ての文字種の違いを識別する場合は、
REGEXP('pattern', field, '')
となります。regexp 演算子は、内部で regexp('pattern', expr) に展開されます。
regexp を件数が多いデータベースで使用すると、検索が遅くなります。単純に文字種の違いを同一視するだけなら、高速な match 演算子をお使いください。
なお、regexp は実行時にパターンを「大文字→小文字」「ひらがな→カタカナ」「全角→半角」にノーマライズします。このため、次のような制約があります。
* regexp 演算子または 'c' オプションを含む regexp 関数
大文字を小文字化するため、\S, \W などの大文字系メタキャラクタは使用できません。[^\s], [^\w] などに置き換えてください。
* regexp 演算子または 'w' オプションを(ACFinder 080921 版以降 'k' も)含む regexp 関数
全角文字を半角化するため、メタキャラクタに該当する「()[]{}.?*+-^$¥」等は、全角文字であっても \ でエスケープする必要があります。
===== concat 関数 (ビルトイン) =====
集約関数、スカラー関数いずれにも使用可能な文字列連結関数です。他の DBMS の concat 関数と異なり、下記の点が異なります。
* 接続する文字列と文字列の間に挿入する接続文字列を指定できる
* NULL や空文字列はもちろん、連結文字列中にすでに存在する文字列は連結しない
==== concat 集約関数 ====
検索された各行(レコード)から特定フィールド等に存在する文字列を連結します。下記のような式で、第1パラメータの connector は接続文字列、第2パラメータ expr は連結する文字列を表す式(通常はフィールド名)を記述します。
CONCAT('connector', expr)
==== concat 関数 ====
下記のような式で、第2パラメータ(expr1)以降の式を左から順に、第1パラメータ(connector)の接続文字列を挟みながら連結します。パラメータ数は可変ですが、第1パラメータを含めて最小で 3、最大で 127 です。
CONCAT('connector', expr1, expr2, ... exprN)
要するに、下記 (1) の式を (2) の式のように書けるということになります。
(1) 'ABC' || ', ' || 'DEF' || ', ' || 'GHI'
(2) CONCAT(', ', 'ABC', 'DEF', 'GHI')
===== concat2 関数 (ビルトイン) =====
集約関数、スカラー関数いずれにも使用可能な文字列連結関数です。上の concat 関数との違いは、連結文字列中にすでに存在する文字列も連結するところです。
CONCAT(', ', 'ABC', 'ABC')
CONCAT2(', ', 'ABC', 'ABC')
の結果は、それぞれ下記のようになります。
ABC
ABC, ABC
===== extnum 関数 (ビルトイン) =====
下記のような式により、expr に「数字+unit-pattern」が存在する場合に、数字部分(整数だけでなく固定小数点・浮動小数点にも対応)を抜き出します。unit-pattern は '回' のように指定しますが、'倍|㎏|g' のように正規表現が使用できます。
「数字+unit-pattern」が存在しない場合は、default で指定した数値を返します。default は省略可能で、省略した場合は 0 を返します。
EXTNUM('unit-pattern', expr, default)
===== re_replace 関数 (ビルトイン) =====
[[http://www.kt.rim.or.jp/~kbk/regex/regex.html|Perl 5.8 互換の正規表現]]で文字列置換を行います。現在の sqlite3.dll には正規表現に対応していない replace 関数がビルトインされていますが、パラメータの並びが異なるので注意してください。
RE_REPLACE('pattern', expr, 'replacement')
===== ifnullstr 関数 (ビルトイン) =====
標準ビルトイン関数の IFNULL と使い方は同じですが、IFNULL(X, Y) は X が NULL の場合のみ Y を返すのに対し、IFNULLSTR は X が NULL または空文字列(%%''%%) の場合に Y を返します。IFNULLSTR の動作は、下記の CASE 文で代替可能ですが、SQL 文のリーダビリティを重視して実装しました。
CASE WHEN X ISNULL OR X = '' WHEN Y ELSE X END
===== if 関数 (ビルトイン) =====
使い方は Excel の IF 関数と同様に、第1パラメータに条件式、第2パラメータに第1パラメータが真の場合の返り値、第3パラメータに第1パラメータが偽の場合の返り値を指定します。
IF(expr-condition, expr-true, expr-false)
これは、下記の CASE 文で代替できます。
CASE WHEN expr-condition THEN expr-true ELSE expr-false END
===== strconv 関数(ビルトイン) =====
第一パラメータの expr で渡された文字列を「大文字/小文字」「ひらがな/カタカナ」「全角/半角」の違い及び「表記の揺れ」を正規化します。expr は式ですが、一般的にはフィールドを指定します。
正規化する文字種は、第二パラメータの option で指定します。option は、MATCH 関数と同じです。option を省略した場合は、'ckwv' を指定したと見なします。
STRCONV(expr[, 'option')
===== preconv 関数 (プリプロセッサ) =====
strconv ビルトイン関数のプリプロセッサ版です。文字列定数を正規化する際に使用します。
下記の3つは意味的には等価ですが、速度は (3) > (1) > (2) の順に速いので、検索する文字列が定数の場合は (3) の使用をお勧めします。
(1) byochu match '%かいがら%'
(2) strconv(byochu) like strconv('%かいがら%')
(3) strconv(byochu) like preconv('%かいがら%')