从列表中选择随机字符串会导致列中填充NULLS [SQL]

时间:2020-06-01 16:33:38

标签: sql sql-server

我试图通过用列表中的新值替换旧值来填充sql中的列。

SELECT CHOOSE(ROUND(RAND() * 3, 1) + 1,'Bill','Steve','Jack')

运行该查询会给我我不想要的NULL实例,为什么我会得到NULL ??

1 个答案:

答案 0 :(得分:2)

CHOOSE只是CASE表达式的简写。我将讨论如何像here多次评估类似RAND()的表达式(请参见“表达式可以多次评估”一节)。我也谈到了这个here(在页面上搜索“ RAND()”)。

基本上,发生的事情是将CHOOSE(expr, a, b)扩展为:

CASE
  WHEN expr = 1 THEN a
  WHEN expr = 2 THEN b
  ELSE NULL
END

每次您看到expr时,都可以再次对其进行评估。因此,第一次调用RAND()时可能会产生2,然后移到下一个WHEN,而这次可能会产生1,那么剩下的就是NULL。 >

解决方案是仅生成一次RAND(),例如

DECLARE @rand tinyint = CONVERT(tinyint, (RAND()*3) + 1);

SELECT CHOOSE(@rand,'Bill','Steve','Jack');