`
javasogo
  • 浏览: 1774066 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用oracle的trunc和dbms_random.value随机取n条数据

阅读更多

场景:今天在review项目代码的时候看到这样一个问题,有一张号码表,每次需要从这样表中随机取6个空闲的号码,也就是每次取出来的6个号码应该都会有所不同。然后我就看到了这样的SQL

select t.*
from tel_number_tbl t
where t.status = '空闲'
and t.area_code = '0571'
and t.delete_flg = '未删除'
and rownum <= 6
order by trunc(dbms_random.value(1,7))

分析:显然,这样写的是不对的,因为其每次都会先按默认排序取出前面6条,然后再对这六条数据进行随机排序,这样会导致每次取出来的六条数据都是一样的,虽然它们每次的顺序都不一样。正确的写法应该是

select * from (
select t.*
from tel_number_tbl t
where t.status = '空闲'
and t.area_code = '0571'
and t.delete_flg = '未删除'
order by trunc(dbms_random.value(1,7)) ) temp
where rownum <= 6

附:
一、oracle trunc()函数的用法
TRUNC(for dates)
精确到天 select trunc(sysdate,'dd') from dual 结果为:2010-9-17
精确到月 select trunc(sysdate,'mm') from dual 结果为:2010-9-1
精确到年 select trunc(sysdate,'yy') from dual 结果为:2010-1-1

TRUNC(for number)
TRUNC函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去。
其具体的语法格式如下
TRUNC(number, [decimals])
其中:
number 待做截取处理的数值
decimals 指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分
下面是该函数的使用情况:
select TRUNC(899.985,2) from dual 结果为:899.98
select TRUNC(899.985) from dual 结果为:899
select TRUNC(899.985) from dual 结果为:800
注意:第二个参数可以为负数,表示为小数点左边指定位数后面的部分截去,即均以0记。

二、dbms_random.value函数
dbms_random是一个可以生成随机数值或者字符串的程序包。这个包有initialize()、seed()、terminate()、value()、normal()、random()、string()等几个函数,但value()是最常用的。
value()的用法一般有两种,
第一种 function value return number;
这种用法没有参数,会返回一个具有38位精度的数值,范围从0.0到1.0,但不包括1.0,如下:
select dbms_random.value() from dual 结果为:0.265729284748573

第二种value带有两个参数,第一个指下限,第二个指上限,将会生成下限到上限之间的数字,但不包含上限,如下:
select dbms_random.value(1,7) from dual 结果为:3.38380283953849

两者合起来用 trunc(dbms_random.value(1,7)) 也就是随机取得整数X , 1<=X<7, 如下:
select trunc(dbms_random.value(1, 7)) from dual 结果为:3

分享到:
评论

相关推荐

    oracle数据库定时任务dbms_job的用法详解

    一、dbms_job涉及到的知识点 1、创建job: variable jobno number; dbms_job.submit(:jobno, —-job号 'your_procedure;',—-执行的存储过程, ';'不能省略 next_date, —-下次执行时间 'interval' —-每次间隔...

    ora_trunc_table.sh

    linux 下 shell 连接 oracle 数据库,对数据库数据处理操作。 脚本产生的背景是生产服务器每天产生几万笔数据,使用的数据库是oralceXE,当数据文件超过4G,会提示错误ORA-12953。因此需要调整数据库中部分表,日志...

    建立新年分区脚本.txt

    from (select to_char(trunc(sysdate + 120, 'yyyy') + level - 1, 'yyyymmdd') rq from dual connect by rownum ) union all --增加最大分区 select 'alter table ' || v_minp_rec.table_owner || '.' || v...

    xinxixueasybtcjj_itmop.com.zip

    for I:=2 to trunc(sqrt(n)) do if n mod I=0 then begin prime:=false; exit; end; prime:=true; end; B.判断longint范围内的数是否为素数(包含求50000以内的素数表): procedure getprime; var i,j:...

    oracle trunc函数使用介绍

    oracle trunc函数使用介绍 1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值。 其具体的语法格式如下: TRUNC(date[,fmt])

    TRUNC_保留小数位

    TRUNC_保留小数位TRUNC_保留小数位TRUNC_保留小数位TRUNC_保留小数位TRUNC_保留小数位TRUNC_保留小数位TRUNC_保留小数位TRUNC_保留小数位TRUNC_保留小数位TRUNC_保留小数位TRUNC_保留小数位TRUNC_保留小数位TRUNC_...

    【delphi_文章】delphi的取整函数round、trunc、ceil和floor.doc

    【delphi_文章】delphi的取整函数round、trunc、ceil和floor.doc

    Oracle中trunc()函数用法处理日期、数字类型数据

    Oracle中trunc()函数用法处理日期、数字类型数据

    SQL语句,查询当月,当年数据

    当月数据 select * from table t where t.create_time &gt;=TRUNC(SYSDATE, 'MM') and t.create_time&lt;=last_day(SYSDATE) create_time为你要查询的时间 当年数据 select * from table t where t.create_time &gt;=...

    oracle trunc()函数的使用方法

    oracle trunc()函数是最常用的函数之一,下面就为您介绍oracle trunc()函数的用法,供您参考,希望可以让您对oracle trunc()函数有更深的认识。 1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值。 其具体的...

    精髓Oralcle讲课笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...

    oracle的trunc函数使用实例

    详细介绍了 oracle 内置 trunc 函数的使用场景及实例,对日期格式和数字格式的数据进行操作

    Oracle_Database_11g完全参考手册.part3/3

    《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,...

    Oracle_Database_11g完全参考手册.part2/3

    《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     事务控制语言(Transactional Control Language,TCL),用于维护数据的一致性,包括COMMIT(提交事务)、ROLLBACK(回滚事务)和SAVEPOINT(设置保存点)3条语句 二、 Oracle的数据类型 类型 参数 描述 字符类型...

    Oracle事例

    20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); &lt;2&gt; 对第1个字段...

    oracle使用管理笔记(一些经验的总结)

    Ⅰ.oracle itcast 1 1.oralce解锁步骤 2 2.oralce开发工具 3 3.oracle常用sql plus命令 4 4.oracle用户管理 5 (1)权限 5 (2)角色 5 (3)方案(schema) 5 (4)用户管理的综合案例 7 (5)账号锁定 8 (6)账号解锁 8 (7)终止...

    DFT的matlab源代码-Inverse-Filtering:使用逆滤波进行图像还原

    使用逆滤波进行图像还原 full_inverse.py 全逆滤波器 trunc_inverse.py 截断逆滤波器 wiener_filter.py 维纳过滤器 cls_constant_y.py 常数Y项约束的最小二乘 cls_iterative_y.py 用迭代计算的Y项约束最小二乘 image...

    日常收集整理oracle trunc 函数处理日期格式(很实用)

    本文给大家分享的oracle trunc 函数处理日期格式的相关知识,非常具有参考价值,具体请看下文说明吧。 代码如下: select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual; –显示当前时间 2011-12-29 16:...

    Oracle8i_9i数据库基础

    第一部分 Oracle SQL*PLUS基础 23 第一章 Oracle数据库基础 23 §1.1 理解关系数据库系统(RDBMS) 23 §1.1.1 关系模型 23 §1.1.2 Codd十二法则 24 §1.2 关系数据库系统(RDBMS)的组成 24 §1.2.1 RDBMS 内核 24...

Global site tag (gtag.js) - Google Analytics