LoginSignup
26
25

More than 5 years have passed since last update.

「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるSQL

Posted at

概要

流行ってたみたいなので、ループ処理が得意でないSQLで挑んでみたらおもしろかった。
リズムパターンの自動生成などに応用してもおもしろそう。

結果

まるで筒井康隆。

貼り付けた画像_2015_07_21_18_48.png

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標準なのがいい。

他に煽られてる人々

参考

26
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
25