li
  当前位置:主页 > 性能优化 > 文章内容
li
使用SQL判断一个数是否质数
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:1  
本文章共1708字,分2页,当前第1页,快速翻页:
 

前两天用SQL计算一个数以内的所有质数,这里补一篇判断一个数是否是质数的SQL实现。

SQL计算100以内的质数:http://yangtingkun.itpub.net/post/468/450278


这个SQL的实现方法前面那个SQL很类似:

SQL> UNDEF NUM
SQL> WITH
2 T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
3 SELECT &NUM
4 || DECODE
5 (
6 (
7 SELECT &NUM FROM DUAL
8 MINUS
9 SELECT A.RN * B.RN FROM T A, T B
10 WHERE A.RN <= ROUND(POWER(&NUM, 0.5))
11 AND B.RN >= ROUND(POWER(&NUM, 0.5))
12 ),
13 NULL,
14 '
'
15 )
16 || '
是质数
'
17 FROM DUAL;
输入 num 的值
: 23原值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)新值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= 23/2)原值 3: SELECT &NUM新值 3: SELECT 23原值 7: SELECT &NUM FROM DUAL新值 7: SELECT 23 FROM DUAL原值 10: WHERE A.RN <= ROUND(POWER(&NUM, 0.5))新值 10: WHERE A.RN <= ROUND(POWER(23, 0.5))原值 11: AND B.RN >= ROUND(POWER(&NUM, 0.5))新值 11: AND B.RN >= ROUND(POWER(23, 0.5))

23||DECODE
----------
23
是质数

SQL> UNDEF NUM
SQL> WITH
2 T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
3 SELECT &NUM
4 || DECODE
5 (
6 (
7 SELECT &NUM FROM DUAL
8 MINUS
9 SELECT A.RN * B.RN FROM T A, T B
10 WHERE A.RN <= ROUND(POWER(&NUM, 0.5))
11 AND B.RN >= ROUND(POWER(&NUM, 0.5))
12 ),
13 NULL,
14 '
'
15 )
16 || '
是质数
'
17 FROM DUAL;
输入 num 的值
: 25原值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)新值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= 25/2)原值 3: SELECT &NUM新值 3: SELECT 25原值 7: SELECT &NUM FROM DUAL新值 7: SELECT 25 FROM DUAL原值 10: WHERE A.RN <= ROUND(POWER(&NUM, 0.5))新值 10: WHERE A.RN <= ROUND(POWER(25, 0.5))原值 11: AND B.RN >= ROUND(POWER(&NUM, 0.5))新值 11: AND B.RN >= ROUND(POWER(25, 0.5))

www.ixdba.net


25||DECODE
----------
25
不是质数

需要注意一点,对于开方结果的四舍五入是很必要的,否则可能会得到错误的结果:

SQL> UNDEF NUM
SQL> WITH
2 T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
3 SELECT &NUM
4 || DECODE
5 (
6 (
7 SELECT &NUM FROM DUAL
8 MINUS
9 SELECT A.RN * B.RN FROM T A, T B
10 WHERE A.RN <= POWER(&NUM, 0.5)
11 AND B.RN >= POWER(&NUM, 0.5)
12 ),
13 NULL,
14 '
'
15 )
16 || '
是质数
'
17 FROM DUAL;
输入 num 的值
: 49原值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)新值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= 49/2)原值 3: SELECT &NUM新值 3: SELECT 49原值 7: SELECT &NUM FROM DUAL新值 7: SELECT 49 FROM DUAL原值 10: WHERE A.RN <= POWER(&NUM, 0.5)新值 10: WHERE A.RN <= POWER(49, 0.5)原值 11: AND B.RN >= POWER(&NUM, 0.5)新值 11: AND B.RN >= POWER(49, 0.5)



阅读更多内容1 · 2 · 下一页>>


  上一篇: 9i上使用CONNECT BY访问DUAL表的...   下一篇: 缺少GROUP BY表达式可以顺利执行...
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·9i上使用CONNECT BY访问DUAL表的...
·数据库升级造成的X_$BH状态异常问...
·表异常增大的bug
·Oracle10201在Enterprise Linux ...
·ORA-600(ktsircinfo_num1)错误
·函数索引产生隐藏列
·如何确定导致刷新组刷新失败的物...
·使用当前用户的数据库链的实现
·添加字段对SQL的影响
·如何确定导致刷新组刷新失败的物...
·缺少GROUP BY表达式可以顺利执行...
·临时表产生REDO过多的bug
·ORA-21561错误
·缺少GROUP BY表达式可以顺利执行...
·Oracle11g物理STANDBY应用日志时...
·用SQL计算100以内的质数
·用SQL实现99乘法表
·使用nlsparam的一个例子
·用SQL解决两道有趣的题(二)
·用SQL解决两道有趣的题(一)
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接