やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3構文 expression(like 句)

 文字列パターン比較式。

成果物

一覧

文法

'文字列' 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

 collateC言語で実装すれば変更できるかも? それ以外は不可と思われる。

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

最適化

 次次回。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで