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



我试图构造一个适合更大的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]
...

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

你可以。 但是,每个查询仅计算一次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

每次调用RAND()时,都会给出一个随机种子,因为您没有指定种子。只要给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

另一种选择是交叉应用

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)

最新更新