🎙️
Hello World あたたたた T-SQL編
この記事は Hello World あたたたた Advent Calendar 2025 シーズン3の17日目の記事です。
SQLについては、すでにPL/pgSQL編が投稿されていますが、本記事では、Microsoft SQL Serverで使用されるT-SQLに焦点を当てつつ、SELECTのみでそれっぽく表現するアプローチをとってみました。
コード
WITH atatatata (hako) AS (
SELECT
CAST('' AS varchar(max))
UNION ALL
SELECT
hako +
CASE ROUND(RAND(CHECKSUM(NEWID())), 0)
WHEN 0 THEN 'あ' ELSE 'た' END
FROM
atatatata
WHERE
hako NOT LIKE '%あたたたた'
)
SELECT * FROM atatatata WHERE hako LIKE '%あたたたた'
UNION ALL
SELECT 'お前はもう死んでいる'
OPTION (MAXRECURSION 0)
/*
hako
------------------------------------------------------
あたたあたあたあああたあたあああたたああたああたたたた
お前はもう死んでいる
(2 行に影響しました)
*/
解説
繰り返しのために再帰CTEを使用しています。
中盤のCASE式、
CASE ROUND(RAND(CHECKSUM(NEWID())), 0)
WHEN 0 THEN 'あ' ELSE 'た' END
にて、'あ', 'た'をランダムに選出しますが、ここで単純にRAND()とすると全部同じ値になってしまうので注意が必要です。なお、RAND(CHECKSUM(NEWID()))という部分はChatGPTに教えてもらいました。
PL/pgSQL編で言及されている通り、「改行せずに標準出力へ書き込む」機能はSQL Serverにもないため、本記事では、途中経過の出力は諦め、2行の結果となるテーブル(ビュー)で表現しています。
最後のOPTION (MAXRECURSION 0)は、デフォルトの再帰回数上限が100回のため、そのままだと制限以内に「~あたたたた」を生成しそこねたときにエラーになってしまいます。そのため、0(無制限)を設定しています。
Discussion