能否在 CASE 语句中使用随机数 (SQL Server 2016)

tom*_*ine 5 sql sql-server random

我尝试构建一个适合更大 SELECT 的 CASE 语句。我希望每一行单独解析(每行使用不同的随机数),但在评估特定行中的 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]
...
Run Code Online (Sandbox Code Playgroud)

但事实上,我有时会得到“其他”结果,这告诉我每个 WHEN 都会创建不同的随机数进行评估。我也无法在开始时声明全局随机数并使用它,因为每一行都应该单独解析。

Gor*_*off 4

可以。但是,rand()每个查询仅计算一次,而不是每行一次。相反,您想用 做一些事情newid()。但是,由于您在 中多次引用该值CASE,因此这带来了挑战。一种方法是:

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
Run Code Online (Sandbox Code Playgroud)

  • 我认为你的意思是“rand()”每行不只计算一次”,否则原始查询将起作用。 (2认同)