概要
流行ってたみたいなので、ループ処理が得意でないSQLで挑んでみたらおもしろかった。
リズムパターンの自動生成などに応用してもおもしろそう。
結果
まるで筒井康隆。
Demo
SQL
with recursive
s (v) as (values ('進捗'),('どう'),('です'),('か')),
t (i, p) as (
select
1,
r.v as p
from
(
select v from s order by random() limit 1
) r
union all
select
t.i + 1,
t.p || r.v as p
from
t,
(
select v from s order by random() limit 1
) r
where
t.p || r.v not like '%進捗どうですか%' or
t.p || r.v like '%進捗どうですか'
)
select
i || '回で煽られました' as "回数",
p || '???' as "進捗どうですか"
from
t
order by
i desc limit 1
解説
- 共通表式(CTE)による再帰SQL(with recursive)を使って、条件付き無限ループをシミュレートする。
- サブクエリrによって、リストからランダムな文字列を取得する。(random()はサブクエリごとに実行してくれる)
- 手続き的な考え方だと無限ループの終了条件のように
t.p || r.v like '%進捗どうですか'
だけでよさそうに思えるけど、それではうまくいかない(そこに至るまでの文字列連結がされない) - この再帰SQLはOracleのconnect byほど高機能ではないけど、SQL99標準なのがいい。
他に煽られてる人々
- reactjs - 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるReactコンポーネント - Qiita
- 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるClojure - Qiita
- 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム | ぞうさんの何でもノート
- 「進捗・どう・です・か」をHaskellで書いてみた - Qiita
- golang の進捗どうですか - Qiita
- Elixir - 進捗どうですか? - Qiita
- 進捗どうですかブーム?にrubyでのっかってみる - Qiita
- 進捗どうですかブーム??にPythonでのりかかってみる - Qiita
- 進捗どうですかブーム???にShellScriptで挑むフリしてExpectに逃げる - Qiita
- 進捗どうですかブーム???に Perl でのりかかる - Qiita
- 「進捗・どう・です・か」をPHPで書いてみた - Qiita
- bat - 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるバッチ - Qiita
- 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム(C#で挑戦) - Qiita
- 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム(C#/LINQ) - Qiita
- 「進捗どうですか」プログラムにおける形態素解析エンジンMeCabの適用 - Qiita