SQLite3構文 expression(glob 句)
文字列パターン比較式。like
句と違い大文字・小文字を区別するが、エスケープ文字を指定できない。
成果物
一覧
文法
'文字列' glob 'パターン'
glob('パターン', '文字列')
- 大文字・小文字を区別する
NOT
で反転できる
メタ文字
メタ文字 | 意味 |
---|---|
? |
任意の1文字 |
* |
任意の0文字以上 |
[abc] |
a ,b ,c のいずれか |
[a-z] |
a 〜z までの文字のいずれか(ASCII文字コード範囲指定) |
[^0-9] |
0 〜9 以外の文字のいずれか |
エスケープ
[]
で囲む。
- エスケープパターン
[?]
[*]
だが[
,]
文字のエスケープは不可能。よってglob
は[
,]
の字を含むテキストのマッチ判定には使えない。
パターンの冗長化
正規表現のように字数指定はできない。たとえばよくある日付の書式を正規表現にすると以下。
\d{4}-\d{2}-\d{2}
これをglobでやると以下のように冗長になってしまう。字数だけパターン用メタ文字を繰り返さねばならない。字数が多ければ現実的でなくなることは察しがつくだろう。
glob '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
?
?
は任意の1字を表す。
select '1A' glob '?A';
1
大文字と小文字の区別はつける。
select '1A' glob '?A';
0
字数が違えば偽。
select '11A' glob '?A';
0
*
*
は任意の0字以上を表す。
select 'A' glob '*A';
1
select '1A' glob '*A';
1
select '11A' glob '*A';
1
select '11A1' glob '*A';
0
前方一致
select 'abc123' glob 'abc*';
1
後方一致
select '123abc' glob '*abc';
1
部分一致
select '123abc456' glob '*abc*';
1
,
区切りの配列内から1つの要素を検索するときは以下。
select (',' || 'abc' || ',') glob '*,abc,*';
1
CSVの先頭や末尾ならabc,*
, *,abc
のパターンもある。だが上記SQL文では、両端に,
を付与することで*,abc,*
パターンに統一している。
メタ文字のエスケープ
[?]
?
を文字としてマッチさせるには[?]
とする。
select 'A?B' glob 'A[?]B'; select 'A!B' glob 'A[?]B';
1 0
[]
で囲わなければメタ文字として解釈される。
select 'A?B' glob 'A?B'; select 'A!B' glob 'A?B'; select 'A123B' glob 'A?B';
1 1 0
[*]
*
を文字としてマッチさせるには[*]
とする。
select 'A*B' glob 'A[*]B'; select 'A-B' glob 'A[*]B';
1 0
[]
で囲わなければメタ文字として解釈される。
select 'A*B' glob 'A*B'; select 'A-B' glob 'A*B'; select 'A123B' glob 'A*B';
1 1 1
[?]
,[*]
のエスケープは不可能
[?]
や[*]
文字列にマッチさせたいときは? 不可能と思われる。glob
にはエスケープ文字を設定する方法がないから。
select 'A[?]B' glob 'A[?]B'; select 'A[?]B' glob 'A[[?]]B'; select 'A[?]B' glob 'A\[?]\B';
0 0 0
つまり、glob
は[
, ]
文字を含む文字列にマッチさせることはできない。
大文字・小文字の区別
必ずする。しないように変更することはできない。
select '1a' glob '?A';
0
select '1A' glob '?A';
1
collate nocase
を使ってもダメ。
select '1a' collate nocase glob '?A'; select '1a' glob '?A' collate nocase; select '1a' collate nocase glob '?A' collate nocase;
0 0 0
以下プラグマを使ってもダメ。
PRAGMA case_sensitive_like = false;
select '1a' glob '?A';
0
以下のようなプラグマは存在しない。
PRAGMA case_sensitive_glob = false;
select '1a' glob '?A';
0
[a-zA-Z]
を使えば1文字分だけは可能。
select '1a' glob '?[a-zA-Z]';
1
だが、これは字数まで一致させねばならない。大文字小文字の無視とは要件が違う。
最適化
次回。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- SQLite 3.29.0
- MeCab 0.996ユーザ辞書
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux
前回まで
- SQLite3学習 俯瞰まとめ
- SQLite3学習 環境構築まとめ
- SQLite3学習 インタフェースまとめ(C言語、CLI、対話モード、Tcl...)
- SQLite3学習 ドットコマンドまとめ
- SQLite3学習 JSON拡張まとめ
- SQLite3学習 FTSまとめ(ICU, MeCab)
- SQLite3学習 再帰クエリ(WITH RECURSIVE)
- SQLite3学習 R-Treeモジュール
- SQLite3学習 Geopoly(2次元ベクタ画像の生成)
- SQLite3学習 拡張関数(generate_series)
- SQLite3学習 拡張ライブラリ数学関数(extension-functions.c)
- SQLite3学習 謎と名前
- SQL文の分類(DDL,DML,TCL,DCL)
- SQL構文 alter(rename)
- SQL構文 alter(add column)概要
- SQL構文 alter(add column)制約
- SQL構文 alter(add column)sqlite_master変更しても反映されない
- SQL構文 alter(add column)スキーマ再定義(テーブル再作成による定義変更)
- SQL構文 analyze
- SQL構文 attach/detach
- SQLite3構文 begin,end,commit,rollback,savepoint(deferred,immediate,exclusive)
- SQLite3構文 コメント
- SQLite3構文 create/drop
- SQLite3構文 index(create/drop)
- SQLite3構文 table(create/drop)
- SQLite3構文 列制約(default)
- SQLite3構文 列制約(collate)
- SQLite3構文 列制約(primary key)
- SQLite3構文 列制約(primary key)ベストプラクティス
- SQLite3構文 列制約(unique)
- SQLite3構文 列制約(not null)
- SQLite3構文 列制約(check)
- SQLite3構文 列制約(foreign key references)
- SQLite3構文 表制約(primary key, unique, check, foreign key)
- SQLite3でメタデータを取得する方法(DB名(スキーマ名)、テーブル名、列名、制約)
- SQLite3でTEMPの保存先を指定する
- SQLite3構文 delete
- SQLite3ビルド失敗(SQLITE_ENABLE_UPDATE_DELETE_LIMIT)
- SQLite3をソースからビルドする(SQLITE_ENABLE_UPDATE_DELETE_LIMIT)
- SQLite3構文 delete(limit offset, order by)
- SQLite3クエリプランニング(インデックスの働き)
- SQLite3構文 explain
- SQLite構文 expression
- SQLite構文 expression(リテラル)
- SQLite構文 expression(パラメータ)
- SQLite構文 expression(演算子)
- SQLite構文 expression(in 句)
- SQLite構文 expression(like 句)