惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
D
Docker
腾讯CDC
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
博客园 - 三生石上(FineUI控件)
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
IT之家
IT之家
WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
博客园 - 【当耐特】

博客园 - ahdung

[转载备份]Transparent windows in WPF CorelDRAW的shell扩展ShellXP.dll导致资源管理器explorer.exe卡死/冻结/无响应/挂起 Windows开的热点手机能连上但上不了网 【手记】桌面变成英文desktop的解决办法 【手记】翻新显卡安装驱动程序 [SQLCLR]跑起unsafe程序集的前提备忘 【手记】让Fiddler捕获到SQLCLR中的网络请求 .Net程序连接SQL Server默认会话选项备查 【手记】Reflexil直接让方法返回true或false 【组件分享】自定义窗口标题菜单 DLL/OCX文件的注册与数据执行保护DEP 【SQL】用SSMS连接Oracle手记 偶尔要用的git命令备忘 【手记】解决Graphics.DrawImage带ImageAttributes在XP报内存不足的问题 似乎是VS2017的一个BUG 【SQL】在数据库中发起http请求的小改进 【手记】解决Intel Management Engine Interface黄色感叹号 【手记】如果Idx/Sub字幕导不进MKVToolNix,看看是否这个原因 【手记】解决涉及office的程序报“Unable to cast COM object of type System._ComObject...”的问题
【SQL】从待选项中随机选一个
ahdung · 2019-06-05 · via 博客园 - ahdung

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

posted on 2019-06-05 09:06  ahdung  阅读(1236)  评论()    收藏  举报