5. 前方最長完全一致検索
• クエリ例
5
SELECT * FROM test;
col1
--------
A
BC
ABC
ABCD
ABCDEF
SELECT * FROM test WHERE col1 IN
(SELECT left('ABCDE',generate_series(1,length('ABCDE'))))
ORDER BY length(col1) DESC LIMIT 1;
col1
------
ABCD
left
-------
A
AB
ABC
ABCD
ABCDE
最長の完全一致を取得
6. 文字列のソート
• order byでの列ソートではなく文字列毎のソート
• つまり
「PQODJHAZBDVACWKABOWPX」を
「AAABBCDDHJKOOPPQVWWXZ」とする
6
8. 文字列のソート
• 途中クエリ2
8
SELECT * FROM test;
col1
------
SQL
DATA
SELECT col1,substr(col1,generate_series(1,length(col1)),1) sub
FROM test ORDER BY col1,sub;
col1 | sub
------+-----
DATA | A
DATA | A
DATA | D
DATA | T
SQL | L
SQL | Q
SQL | S
1文字ずつ分解してsort
9. 文字列のソート
• クエリ例
9
SELECT * FROM test;
col1
-----------------------
PQODJHAZBDVACWKABOWPX
UDFPGIEHAPTNVUDIIEHAO
SELECT col1,array_to_string(array_agg(sub),'') sorted FROM
(SELECT col1,substr(col1, generate_series(1,length(col1)),1) sub
FROM test ORDER BY col1,sub) foo GROUP BY col1;
col1 | sorted
-----------------------+-----------------------
PQODJHAZBDVACWKABOWPX | AAABBCDDHJKOOPPQVWWXZ
UDFPGIEHAPTNVUDIIEHAO | AADDEEFGHHIIINOPPTUUV
10. 欠番探し
• クエリ例
10
SELECT id FROM test;
id
---------
ID00005
ID00006
ID00008
ID00009
ID00010
SELECT id FROM (SELECT 'ID' || lpad(generate_series(1,10)::text,5,'0') id)
foo WHERE id NOT IN (SELECT id FROM test);
id
---------
ID00001
ID00002
ID00003
ID00004
ID00007
id
---------
ID00001
ID00002
ID00003
ID00004
ID00005
ID00006
ID00007
ID00008
ID00009
ID00010
文字列連結、lpad、
castを併用