やってみる

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

SQLite3構文 expression(in 句)

 いずれかと一致するか否か。

成果物

情報源

一覧

スカラー値

整数

select 3 in (1,3,5);
1
select 4 in (1,3,5);
0

 16進数表記もOK。

select 0xA in (0xA, 0xB);
1
select 0xA in (0xC, 0xB);
0

浮動少数

select 3.14 in (3.14, 3.15, 3.16);
1
select 3.14 in (3.13, 3.15);
0

 後続が0なら同値とみなす。

select 3.14 in (3.140);
1

 後続が0以外なら異なる値とみなす。

select 3.14 in (3.1401);
0

文字列

select 'A' in ('A','B');
1
select 'A' in ('C','B');
0

 スペースが入っているなど1字でも違えば偽。

select 'A' in ('A ',' A');
0

 大文字と小文字を区別する。

select 'A' in ('a');
0

 collate句で区別しないようにもできる。

select 'A' collate nocase in ('a');
1

バイナリ

select x'FF' in (x'00', x'FF');
1
select x'FF' in (x'00', x'11');
0

NULL

select NULL in (0, 'NULL', x'00');



 あれ、空白? NULLが出力された?

 公式によると以下。

左=NULL 右にNULL 右は空セット 右に左が有る INの結果
N N N N False
- N Y N False
N - N Y True
N Y N N NULL
Y - N - NULL

 あれ、以下NYNNパターンだけどNULLにならず0だよ? 公式さんの説明表まちがってない? 挙動としてはこうなって欲しいのでいいのだけど。

select 0 in (1, 'NULL', x'00');
0
select 0 in (0, 'NULL', x'00');
1

 右が空のときは偽。

select 1 in ();
0

行値

 inの右オペランドがサブクエリのとき。

select (1,'A',x'FF') in (select 1,'A',x'FF' union select 2,'B',x'00');
1
select (1,'A',x'FF') in (select 0,'A',x'FF' union select 2,'B',x'00');
0

 列数が一致しないとエラー。

select (1,'A',x'FF') in (select 1,'A',x'FF',1.2 union select 2,'B',x'00');
Error: SELECTs to the left and right of UNION do not have the same number of result columns

対象環境

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

前回まで