やってみる

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

SQLite3謎 values()構文

 values()構文をみつけたが、資料が見つからない。なにこれ?

成果物

values()

sqlite3 :memory: "values(1,'A')"
1|A

 たまたま発見したvalues()。これ、一体何者?

関数一覧に出てこない

sqlite3 :memory: "pragma function_list;" | grep values

使ってみる

 ターミナルで以下コマンド実行。

sqlite3

 対話モードにて色々やってみる。

.headers on
.mode column

表を返すものである

values(1);
column1   
----------
1         
values(1,'A');
column1     column2   
----------  ----------
1           A         
values(1,'A') union values(2,'B');
column1     column2   
----------  ----------
1           A         
2           B         

列名を変更する

select column1 as id, column2 as name 
from (values(1,'A') union values(2,'B'));
id          name      
----------  ----------
1           A         
2           B         

型をもっている

select typeof((values(1)));
typeof((values(1)))
-------------------
integer            
select typeof((values(1.2)));
typeof((values(1.2)))
---------------------
real                 
select typeof((values('A')));
typeof((values('A')))
---------------------
text                 
select typeof((values(x'FF')));
typeof((values(x'FF')))
-----------------------
blob                   

関数ではない

 select句などを用いず、単独でvalues(1);とすれば表を返す。このことからSQL関数ではないと思われる。

 たとえば、部分文字列を取得するSQL関数substrを使うときは、select句内で実行せねばsyntax errorを返す。

substr('ABC',1,1);
Error: near "substr": syntax error
select substr('ABC',1,1);
substr('ABC',1,2)
-----------------
AB               

 逆に、values()select句内で実行するとsyntax errorを返す。

select values(1);
Error: near "values": syntax error
values(1);
column1   
----------
1         

 ただし、from句では()で囲むと成功した。副問合せと同じ扱いか。

select * from (values(1));
column1   
----------
1         
select * from (select 1 as column1);
column1   
----------
1         
select * from (select 1 as column1, 'A' as column2);
column1     column2   
----------  ----------
1           A        

select * from (select (1,'A'));

 やはりこれは表を返すtable-valued function(表値関数、テーブル値関数)というヤツなのだろうか?

所感

 values()、一体何者? 説明が見つけられない。

対象環境

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

前回まで