やってみる

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

SQLite3で日本人のフルネームをランダムに取得する(男女比1:1)

 ついでに出席番号順に並べた。

成果物

$ run.sh
1  あさこ   そうすけ    旦来  壮亮  m
2  あさじま    れいか   朝島  鈴蘭  f
3  あみくら    まつり   網蔵  まつり   f
4  いがた   りか  伊形  梨和  f
5  いしたに    しずま   石谷  鎮麻  m
6  いそじま    よしひと    礒嶋  善人  m
7  いながわ    つぐみ   稲川  紬玖美   f
8  いりょうだ このか   井料田   来遥  f
9  いんべ   ゆきな   斎部  悠綺奈   f
10 うきはし    みみか   浮橋  美実果   f
11 おおみさき かいる   大岬  界瑠  m
12 おくじま    えれん   奥嶋  咲蓮  f
13 かわらい    せいや   河原井   晟耶  m
14 きすい   あやは   木須井   恵葉  f
15 きだち   みゆか   木立  実有佳   f
16 きんたか    しょうじ    金高  招二  m
17 くらいえ    たけお   倉家  丈夫  m
18 ぐんじょう りいち   郡上  莉市  m
19 こいかわ    てんしょう 鯉川  天章  m
20 こもち   ありさ   小餅  有里彩   f
21 これのり    まさき   是則  正樹  m
22 ごろかわ    みこと   五郎川   望詞  f
23 さだて   えみな   左舘  咲奈  f
24 しおがま    しげのり    塩竃  茂記  m
25 しもくがき ゆういち    下工垣   遊一  m
26 しもまき    まほ  下牧  真捗  f
27 すぎかわ    いちた   杉川  壱舵  m
28 たけなみ    けいすけ    武濤  恵佑  m
29 たてやま    げんと   竪山  弦兎  m
30 ちごどう    さおり   児堂  紗織  f
31 となき   りく  渡名喜   龍来  m
32 どえ  きよこ   土江  樹世子   f
33 なかやま    もか  名嘉山   文奏  f
34 はたしま    しょうき    畑島  昌葵  m
35 ひやま   ひろたか    比山  紘宗  m
36 ひらきざわ れいな   開澤  礼奈  f
37 ふじしま    みれい   藤島  美澪  f
38 みの  ひまり   身野  妃万理   f
39 もりみや    ともや   森宮  朋矢  m
40 りゅうの    たけよし    龍野  竹義  m
$ time run.sh
...
real    0m0.656s
user    0m0.614s
sys 0m0.056s

所感

 SQL文を文字列としてシェルで組み立てた。理由は2つある。

  • 全部SQL文だけで書くと重複しまくりDRYに書けない
  • where句を動的に変更したい場合、SQL文を文字列で動的生成するしかない

 全部SQLだけでやろうとするとwhere句などを動的にできない。@NUMなどのパラメータを使おうにも、ひとつの値を変数にすることしかできない。SQL文自体を変数として挿入することができない。

 SQL文内で使える自作関数の作成ができたら便利なのに……。他のRDBMSではストアド・ファンクションとして実装できるらしい。だがSQLite3では未実装。C言語ライブラリで実装するか、他のバインディング言語のAPIを使う。SQL文では書けない。 そもそも、ストアド・ファンクションの戻り値は列の型を返せるのであって、表を返すことはできない?

 SQL文をSQL内で関数化できないためDRYに書けない。重複しまくり冗長で可読性も保守性も悪いクソコードになる。かといって他の言語で文字列としてSQL文を作ると、それはそれで読みづらい。サブクエリを関数化したい!

対象環境

$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux