Pouvez-vous utiliser des nombres randoms dans une instruction CASE (SQL Server 2016)

J'ai essayé de build une déclaration CASE qui s'inscrira dans un plus grand SELECT. Je souhaite que chaque ligne soit résolue séparément (en utilisant un nombre random différent par ligne) mais que le nombre random soit le même lors de l'évaluation de l'instruction case dans une ligne particulière si cela a du sens.

j'ai essayé

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] ... 

mais le fait que je reçois parfois un résultat «autre» me dit que chaque WHEN crée un nombre random différent à évaluer. Je ne peux pas non plus déclarer un nombre random global au début et l'utiliser car chaque ligne doit être résolue séparément.

Tu peux Cependant, rand() est évalué une seule fois par requête, pas une fois par ligne. Au lieu de cela, vous voulez faire quelque chose avec newid() . Cependant, parce que vous referencez la valeur plusieurs fois dans le CASE , cela pose un défi. Une méthode est:

 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 

Chaque fois que vous appelez RAND() , une graine random est donnée puisque vous n'en avez pas spécifié une. Donnez juste une graine à RAND() et elle restra la même.

 select case when 1 = 1 then rand(4) end ,case when 2=2 then rand(4) end 

Ou utilisez une valeur de colonne …

 select case when 1 = 1 then rand(someColumn) end ,case when 2=2 then rand(someColumn) end 

Une autre option est avec une application croisée

Exemple

 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)