我使用以下语句(这是一个缩短版本作为示例)从Microsoft SQL Express 2012数据库中获取结果:
SELECT id, name, city
FROM tblContact
ORDER BY RAND(xxx)
并为xxx
部分注入存储在会话中的种子,以便结果对于给定会话始终是随机的(因此,当通过结果进行分页时,用户不会看到重复项)
问题:无论种子是什么,结果都以相同的顺序返回
我也试过这个:
SELECT id, name, city, RAND(xxx) AS OrderValue
FROM tblContact
ORDER BY OrderValue
两者都给出相同的(意外结果) - 我是否错误地使用了它?
答案 0 :(得分:4)
整个查询的rand(seed)
值相同,我想使用ID列在每行的行上生成随机值:
SELECT id, name, city, RAND(xxx + id) AS OrderValue
FROM tblContact ORDER BY OrderValue
但是我过去一直在开发一些功能,我需要为不同的会话提供随机顺序,但同一会话中的顺序相同。那时我使用了HASHBYTES()
并且效果非常好:
SELECT id, name, city, HASHBYTES('md5',cast(xxx+id as varchar)) AS OrderValue
FROM tblContact ORDER BY OrderValue
答案 1 :(得分:1)
通常,newid()
函数用于此目的:
SELECT id, name, city
FROM tblContact
ORDER BY newid();
我听说rand(checksum(newid()))
实际上有更好的属性作为随机数生成器:
SELECT id, name, city
FROM tblContact
ORDER BY rand(checksum(newid()));
如果您希望从一个查询到下一个查询的结果一致,那么@ dimt的解决方案使用id
或函数id
。
答案 2 :(得分:0)
在SQL Server中,Rand()为查询计算一次。要获得随机订单,请使用ORDER BY NEWID()。