参考资料
Oracle中随机抽取N条记录
http://hpitcn.iyunv.com/blog/676330
1 dbms_random.random[常用方法(随机获取一条数据)]
select * from (select t.* from T t order by dbms_random.random) where rownum<2;
2 内部函数sys_guid()
select * from (select t.* from T t order by sys_guid()) where rownum < (select count(1) from T);
select * from (select t.* from T t order by sys_guid()) where rownum <2;
3 使用sample获得随机结果集
select * from T sample(10) seed(10) where rownum<6;
select * from T sample block(10) where rownum<6;
参考资料 dbms_random包
获得随机小数Sql如下:
select dbms_random.value from dual;
0.438497011075884
限制小数的取值范围可以将dbms_random.value换为dbms_random.value(30,50)
其中的30和50就是它的取值范围.
约束下小数位数Sql如下:
select round(dbms_random.value,3) from dual;
0.819 保留小数位数为3位的随机数
获得随机整数呢?
select floor(dbms_random.value(30,50)) from dual;
这样就可以取得到30到50之间的随机整数啦。
dbms_random.random这样也可以获得整数。不过值过大。
注: 在使用sys_guid() 这种方法时,有时会获取到相同的记录,即和前一次查询的结果集是一样的,查找相关资料,有些说是和操作系统有关,在windows平台下正常,获取到的数据是随机的,而在linux等平台下始终是相同不变的数据集,有些说是因为sys_guid()函数本身的问题,即sys_guid()会在查询上生成一个16字节的全局唯一标识符,这个标识符在绝大部分平台上由一个宿主标识符和进程或进程的线程标识符组成,这就是说,它很可能是随机的,但是并不表示一定是百分之百的这样。
所以,为确保在不同的平台每次读取的数据都是随机的,我们大多采用使用sample函数或者DBMS_RANDOM包获得随机结果集,其中使用sample函数更常用,因为其查询时缩小了查询范围,在查询大表,且要提取数据不是很不多的情况下,会对查询速度上有明显的提高。