欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【SQL】从待选项中随机选一个

程序员文章站 2022-03-22 12:18:12
由于SQL Server没有数组类型,所以在面对“从若干待选项中选一个”这种需求时,往往要采取变通办法,比如弄个‘a|b|c’这样的字符串然后对字符串进行处理;又或者把待选项塞进一个临时表,然后把问题变成如何select的问题。下面的写法就是采用后一种,只不过得益于VALUES和CTE,我们不必真的 ......

由于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())

求更好写法,感谢。

-eof-