【SQL】オプションからランダムに1つ選択

5013 ワード

SQL Serverには配列タイプがないため、「いくつかの選択肢から1つを選択する」というニーズに直面した場合、「a|b|c」のような文字列を作って文字列を処理するなど、融通のきかない方法を採用することが多い.また、オプションを一時テーブルに詰めて、問題をどのようにselectするかの問題にします.次の書き方は後者を採用していますが、VALESやCTEのおかげで、私たちは本当に臨時表や表変数などを一目で作る必要はありません.コードをよりコンパクトにし、冗長にならないようにすることができます.
書き方1:
DECLARE @choice INT = (
SELECT Amount FROM (VALUES
 ( 88, 0)
,(118, 1)
,(138, 2)
,(188, 3) --  1:      ,      
) AS a(Amount,RowNo)
WHERE RowNo = FLOOR(4*RAND())) --  2:           ,      

書き方2:
WITHの前にセミコロンを付けるのは保険の書き方です.そうしないと、メッセージ336の文法の問題に遭遇する可能性があります.
DECLARE @choice INT
;WITH cte AS (SELECT ROW_NUMBER() OVER(ORDER BY Num) AS RowNo,Num FROM (VALUES
 (88)
,(118)
,(138)
,(188)
) AS a(Num))
SELECT @choice=Num FROM cte WHERE RowNo=CEILING((SELECT COUNT(1) FROM cte)*RAND())

書き方3:
コメントエリア@張工502219048に指導され、newid()という関数の特性を利用してorder by newid()はtop 1と結合してランダムに選択できる効果があり、番号やrandを全く使わず、書き方を大幅に簡略化することができ、ここで彼に感謝します.
DECLARE @choice INT = (
SELECT TOP 1 Num FROM (VALUES
 (88)
,(118)
,(138)
,(188)
) AS a(Num) ORDER BY NEWID())

もっと良い書き方を求めて、感謝します.
-EOF-