您能否在案例陈述中使用随机数(SQL Server 2016)

您能否在案例陈述中使用随机数(SQL Server 2016),sql,sql-server,random,Sql,Sql Server,Random,我试图构建一个案例陈述,它将适合更大的选择。我希望每一行分别使用不同的随机数来解析,但是如果有意义的话,在计算特定行中的case语句时,随机数是相同的 我试过了 SELECT [Player name] ,[Stake] ,[current jackpot] ,CASE WHEN rand() < 0.23 THEN 'Win' WHEN

我试图构建一个案例陈述,它将适合更大的选择。我希望每一行分别使用不同的随机数来解析,但是如果有意义的话,在计算特定行中的case语句时,随机数是相同的

我试过了

    SELECT 
    [Player name]
    ,[Stake]
    ,[current jackpot]

         ,CASE

         WHEN 
         rand() < 0.23
         THEN
         'Win'
         WHEN
         rand() BETWEEN 0.23 AND 0.89
         then
         'Lose'
         when
         rand() >= 0.89
         then
         'Jackpot'
         else
         'other'
         end as [outcome]
...
但事实上,我有时会得到一个“其他”的结果,这告诉我,每个人都在创建一个不同的随机数进行评估。我也不能在开始时声明一个全局随机数并使用它,因为每一行都应该单独解析

每次调用RAND时,都会给出一个随机种子,因为您没有指定种子。只要给兰德一粒种子,它就会保持不变

select 
    case when 1 = 1 then rand(4) end
    ,case when 2=2 then rand(4) end
或者使用列值

select 
    case when 1 = 1 then rand(someColumn) end
    ,case when 2=2 then rand(someColumn) end
你可以。但是,rand在每个查询中只计算一次,而不是每行计算一次。相反,你想用newid做点什么。但是,由于在本例中多次引用该值,因此这是一个挑战。一种方法是:

SELECT . . .
        (CASE WHEN rnd < 0.23 THEN 'Win'
              WHEN rnd < 0.89 THEN 'Lose'
              WHEN rnd >= 0.89 THEN 'Jackpot'
              ELSE 'Other' -- impossible
         END) as [outcome]
FROM (SELECT t.*, rand(convert(varbinary, newid())) as rnd
      FROM t
     ) t
另一个选项是交叉应用

范例


您可以声明一个变量并保存这个rand值,然后在查询中使用它。您可以使用rownumber之类的种子,这将使每一行的值相同,但其他行的值不同。然后可能会在行中添加MinuteNow,以便在运行之间有所不同。前面提到的副本实际上不是一个副本。在这种情况下,OP在SELECT中多次引用同一随机数。这会产生差异。选择rand_值<0.23时的情况,然后。。。。。从中选择rand作为rand_value@ventik-不幸的是,T-SQL无法保证它对函数/表达式求值的次数与该函数/表达式在查询中文本显示的次数。这难道不意味着每一行的结果都相同吗?是的,如果给它一个种子和否,如果您使用的列对该行是唯一的。我想您的意思是,rand不是每行只计算一次,否则原始查询将起作用。@DStanley。我的意思是每次查询一次。谢谢你的澄清。
Select [Player name]
      ,[Stake]
      ,[current jackpot]
      ,[OutCome] = case when b.randV<0.23 then 'win'
                        when b.randV between 0.23 and 0.89 then 'lose'
                        when b.randV>=0.89 then 'Jackpot'
                        else 'other' end
 From  YourTable
 Cross Apply (values (rand(cast( NewID() as varbinary )))) B(randV)