zoukankan      html  css  js  c++  java
  • 【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-

  • 相关阅读:
    kettle安装及初步使用
    Datax初步使用
    可修改性及其实现战术(hot words)
    淘宝网的六个质量属性
    python数据可视化笔记---——matplotlib.pyplot()
    Linux虚拟环境virtualevn
    deepin安装虚拟环境virtualenv
    python面试题-web后端
    rabbitmq和redis用作消息队列的区别
    nginx配置项概括说明
  • 原文地址:https://www.cnblogs.com/ahdung/p/10977640.html
Copyright © 2011-2022 走看看