【SQL】從待選項中隨機選一個


由於SQL Server沒有數組類型,所以在面對“從若干待選項中選一個”這種需求時,往往要采取變通辦法,比如弄個‘a|b|c’這樣的字符串然后對字符串進行處理;又或者把待選項塞進一個臨時表,然后把問題變成如何select的問題。下面的寫法就是采用后一種,只不過得益於VALUES和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-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM