我正在查看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
Run Code Online (Sandbox Code Playgroud)
它返回一个非常奇怪的结果集:
Use
-------------------------------------------------- -----------
workshop 128
HOW IS THIS POSSIBLE 633
NULL 287
retail 140
warehouse 258
market 177
office 209
Run Code Online (Sandbox Code Playgroud)
第二个结果集完全合理:
n
----------- -----------
0 292
3 300
1 313
4 277
5 311
2 339
Run Code Online (Sandbox Code Playgroud)
两个结果集的数据都在同一个更新语句中生成.
所以我的问题是为什么一个超出0-5范围的数字命中我的案例陈述?这个数字是多少?为什么我直接更新int是正确分配的东西?
我有个主意:
也许值是在每个when语句上计算的,如果它到达第一个,计算一个非0的值,它到第二个,然后计算一个非1的值,然后是下一个,依此类推,如果它它是5的方式,然后计算除了5以外的数字.
这也可以解释为什么存在比其他更多"如何可能"的情况,当当前位置和在该位置产生的随机数匹配时,其他的会增加.
你的意见?
编辑:我也在sql server express 2008中测试过,结果相同.
归档时间: |
|
查看次数: |
689 次 |
最近记录: |