我正在查看postgres问题,并且它要求使用随机值更新表.
我只是注意到它在回答之后就是以postgres为目标,但在回答它时我发现了一个谜.
这是我的问题示例代码:
create table #Buildings([Use] varchar(50), n int) insert #Buildings select null,null from sysobjects update #Buildings set [Use] = case (ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 6) when 0 then null when 1 then 'warehouse' when 2 then 'office' when 3 then 'market' when 4 then 'retail' when 5 then 'workshop' else 'HOW IS THIS POSSIBLE' end, n = ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 6 select [Use], count(*) from #Buildings group by [Use] select n, count(*) from #Buildings group by n
它返回一个非常奇怪的结果集:
Use -------------------------------------------------- ----------- workshop 128 HOW IS THIS POSSIBLE 633 NULL 287 retail 140 warehouse 258 market 177 office 209
第二个结果集完全合理:
n ----------- ----------- 0 292 3 300 1 313 4 277 5 311 2 339
两个结果集的数据都在同一个更新语句中生成.
所以我的问题是为什么一个超出0-5范围的数字命中我的案例陈述?这个数字是多少?为什么我直接更新int是正确分配的东西?
我有个主意:
也许值是在每个when语句上计算的,如果它到达第一个,计算一个非0的值,它到第二个,然后计算一个非1的值,然后是下一个,依此类推,如果它它是5的方式,然后计算除了5以外的数字.
这也可以解释为什么存在比其他更多"如何可能"的情况,当当前位置和在该位置产生的随机数匹配时,其他的会增加.
你的意见?
编辑:我也在sql server express 2008中测试过,结果相同.