I am trying to populate a column in sql by replacing old values with new values from a list.
SELECT CHOOSE(ROUND(RAND() * 3, 1) + 1,'Bill','Steve','Jack')
Running this query gives me instances of NULLS which i don’t want, why am i getting NULLS?
Advertisement
Answer
CHOOSE
is just shorthand for a CASE
expression. I talk about how an expression like RAND()
can be evaluated more than once here (see the section “Expressions can be evaluated more than once”). I also talk about this here (search the page for “RAND()
“).
Basically, what happens is CHOOSE(expr, a, b)
gets expanded to:
CASE WHEN expr = 1 THEN a WHEN expr = 2 THEN b ELSE NULL END
Each time you see expr
there, it can be evaluated again. So the first time you call RAND()
it could yield 2, then it moves to the next WHEN
, and this time it could yield 1, then all that’s left is NULL
.
The solution is to generate RAND()
just once, e.g.
DECLARE @rand tinyint = CONVERT(tinyint, (RAND()*3) + 1); SELECT CHOOSE(@rand,'Bill','Steve','Jack');