文字列パターン比較式。
成果物
一覧
文法
'文字列' like 'パターン'
'文字列' like 'パターン' escape 'エスケープ文字'
like('パターン', '文字列')
like('パターン', '文字列', 'エスケープ文字')
NOT
句で反転できる
メタ文字
パターンに使えるメタ文字は以下2種類。
メタ文字 | 意味 |
---|---|
_ |
任意の1文字 |
% |
任意の0文字以上 |
大文字小文字
する。
PRAGMA case_sensitive_like = true;
しない。
PRAGMA case_sensitive_like = false;
_
任意の1文字であるか否か。
select 'A' like '_';
1
少なくても偽。
select '' like '_';
0
多くても偽。
select 'AA' like '_';
0
指定したい字数だけ_
をパターンに記せばいい。
%
前方一致
select 'abc123' like 'abc%';
1
後方一致
select '123abc' like '%abc';
1
部分一致
select '123abc456' like '%abc%';
1
,
区切りの配列内から1つの要素を検索するときは以下。
select (',' || 'abc' || ',') like '%,abc,%';
1
CSVの先頭や末尾ならabc,%
, %,abc
のパターンもある。だが上記SQL文では、両端に,
を付与することで%,abc,%
パターンに統一している。\|\|
は文字列結合する演算子。
メタ文字のエスケープ
_
select '0_A' like '_\_A' escape '\';
1
%
select '100%' like '%\%' escape '\';
1
select '-2.5%' like '%\%' escape '\';
1
大文字・小文字の区別
ASCII文字は区別しない
デフォルトでは、ASCII文字は大文字・小文字を区別しない。
select '1a' like '_A';
1
select '1A' like '_A';
1
なお、collate binary
句を使っても区別するようにはできなかった。
select '1a' collate binary like '_A'; select '1a' like '_A' collate binary;
1 1
select '1a' like collate binary '_A';
Error: near "collate": syntax error
ASCII文字以外は区別する
select '1ア' like '_ア';
0
select '12' like '_2';
0
collate
をC言語で実装すれば変更できるかも? それ以外は不可と思われる。
- SQLite3構文 列制約(collate)
- SQLite3拡張 ICUでcollateする
- https://www.sqlite.org/src/artifact?ci=trunk&filename=ext/icu/README.txt
- https://qiita.com/Nanashia/items/21f2c4b6fbd68db13d3e
ASCII文字を区別するよう設定する
PRAGMA case_sensitive_like = true;
select '1a' like '_A';
0
偽になった。同値なら真。
select '1A' like '_A';
1
like()
関数
関数でも表現できる。
like('パターン', '文字列')
like('パターン', '文字列', 'エスケープ文字')
やってみる。
select like('_A', '1A');
1
select like('_A', '11A');
0
select like('%A', '11A');
1
select like('%\%', '100%', '\');
1
NOT
NOT
で結果を反転できる。
select '1A' not like '_A';
0
select not like('_A', '1A');
0
最適化
次次回。
対象環境
- 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 句)