ACFinder では、SQLite3 をより便利に使うために、SQLite3 の SQL を拡張しています。
機能拡張の方法として、SQLite データベースエンジンに関数・演算子を組み込むビルトイン関数と、SQLite データベースエンジンに SQL を渡す前に ACFinder 側で処理するプリプロセッサ関数があります。
「大文字/小文字」「ひらがな/カタカナ」「全角/半角」の違い及び「表記の揺れ」を全て同一視する、like 類似演算子です1)。1文字ワイルドカードの '_' に対応していないことを除き、下記のように使い方は like 演算子と全く同じです。左辺の expr は式ですが、一般的にはフィールド名を記述します。
完全一致: expr MATCH 'pattern' 前方一致: expr MATCH 'pattern%' 後方一致: expr MATCH '%pattern' 部分一致: expr MATCH '%pattern%'
同一視したくない文字種がある場合は、match 関数を使用してください。option パラメータは省略可能で、省略した場合は 'ckwv' が指定されたと見なします2)。このため、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' と同じ意味になります。
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 は実行時にパターンを「大文字→小文字」「ひらがな→カタカナ」「全角→半角」にノーマライズします。このため、次のような制約があります。
大文字を小文字化するため、\S, \W などの大文字系メタキャラクタは使用できません。[^\s], [^\w] などに置き換えてください。
全角文字を半角化するため、メタキャラクタに該当する「()[]{}.?*+-^$¥」等は、全角文字であっても \ でエスケープする必要があります。
集約関数、スカラー関数いずれにも使用可能な文字列連結関数です。他の DBMS の concat 関数と異なり、下記の点が異なります。
検索された各行(レコード)から特定フィールド等に存在する文字列を連結します。下記のような式で、第1パラメータの connector は接続文字列、第2パラメータ expr は連結する文字列を表す式(通常はフィールド名)を記述します。
CONCAT('connector', expr)
下記のような式で、第2パラメータ(expr1)以降の式を左から順に、第1パラメータ(connector)の接続文字列を挟みながら連結します。パラメータ数は可変ですが、第1パラメータを含めて最小で 3、最大で 127 です。
CONCAT('connector', expr1, expr2, ... exprN)
要するに、下記 (1) の式を (2) の式のように書けるということになります。
(1) 'ABC' || ', ' || 'DEF' || ', ' || 'GHI' (2) CONCAT(', ', 'ABC', 'DEF', 'GHI')
集約関数、スカラー関数いずれにも使用可能な文字列連結関数です。上の concat 関数との違いは、連結文字列中にすでに存在する文字列も連結するところです。
CONCAT(', ', 'ABC', 'ABC') CONCAT2(', ', 'ABC', 'ABC')
の結果は、それぞれ下記のようになります。
ABC ABC, ABC
下記のような式により、expr に「数字+unit-pattern」が存在する場合に、数字部分(整数だけでなく固定小数点・浮動小数点にも対応)を抜き出します。unit-pattern は '回' のように指定しますが、'倍|㎏|g' のように正規表現が使用できます。
「数字+unit-pattern」が存在しない場合は、default で指定した数値を返します。default は省略可能で、省略した場合は 0 を返します。
EXTNUM('unit-pattern', expr, default)
Perl 5.8 互換の正規表現で文字列置換を行います。現在の sqlite3.dll には正規表現に対応していない replace 関数がビルトインされていますが、パラメータの並びが異なるので注意してください。
RE_REPLACE('pattern', expr, 'replacement')
標準ビルトイン関数の 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
使い方は 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
第一パラメータの expr で渡された文字列を「大文字/小文字」「ひらがな/カタカナ」「全角/半角」の違い及び「表記の揺れ」を正規化します。expr は式ですが、一般的にはフィールドを指定します。
正規化する文字種は、第二パラメータの option で指定します。option は、MATCH 関数と同じです。option を省略した場合は、'ckwv' を指定したと見なします。
STRCONV(expr[, 'option')
strconv ビルトイン関数のプリプロセッサ版です。文字列定数を正規化する際に使用します。
下記の3つは意味的には等価ですが、速度は (3) > (1) > (2) の順に速いので、検索する文字列が定数の場合は (3) の使用をお勧めします。
(1) byochu match '%かいがら%' (2) strconv(byochu) like strconv('%かいがら%') (3) strconv(byochu) like preconv('%かいがら%')