PLSQL应用问题汇总.doc

上传人:大米 文档编号:560134437 上传时间:2024-01-01 格式:DOC 页数:21 大小:102.01KB
返回 下载 相关 举报
PLSQL应用问题汇总.doc_第1页
第1页 / 共21页
PLSQL应用问题汇总.doc_第2页
第2页 / 共21页
PLSQL应用问题汇总.doc_第3页
第3页 / 共21页
PLSQL应用问题汇总.doc_第4页
第4页 / 共21页
PLSQL应用问题汇总.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《PLSQL应用问题汇总.doc》由会员分享,可在线阅读,更多相关《PLSQL应用问题汇总.doc(21页珍藏版)》请在金锄头文库上搜索。

1、第一部分:查询常用语句汇总1.case when then条件表达式CASE WHEN condition THEN result WHEN . ELSE resultENDCASE 子句可以用于任何表达式可以有效存在的地方。 condition 是一个返回boolean 的表达式。 如果结果为真,那么 CASE 表达式的结果就是符合条件的 result。 如果结果为假,那么以相同方式搜寻任何随后的 WHEN 子句。 如果没有 WHEN condition 为真,那么 case 表达式的结果就是在 ELSE 子句里的值。 如果省略了 ELSE 子句而且没有匹配的条件, 结果为 NULL。 例子

2、: SELECT * FROM test; a- 1 2 3SELECT a, CASE WHEN a=1 THEN one WHEN a=2 THEN two ELSE other END FROM test; a | case-+- 1 | one 2 | two 3 | other所有 result 表达式的数据的类型都必须可以转换成单一的输出类型。 下面这个简单的 CASE 表达式是上面的通用形式的一个特殊的变种。 CASE expression WHEN value THEN result WHEN . ELSE resultEND先计算 expression 的值, 然后与所有在W

3、HEN 子句里声明的 value 对比,直到找到一个相等的。 如果没有找到匹配的,则返回在 ELSE 子句里的 result (或者 NULL)。 这个类似于 C 里的 switch 语句。 上面的例子可以用简单 CASE 语法来写: SELECT a, CASE a WHEN 1 THEN one WHEN 2 THEN two ELSE other END FROM test; a | case-+- 1 | one 2 | two 3 | otherCASE 表达式并不计算任何对于判断结果并不需要的子表达式。 比如,下面是一个可以避免被零除的方法: SELECT . WHERE CASE

4、 WHEN x 0 THEN y/x 1.5 ELSE false END;2.oraclepl/sqlINSTR(C1,C2,I,J)INSTR(C1,C2,I,J) 在一个字符串中搜索指定的字符,返回发现指定的字符的位置;C1 被搜索的字符串C2 希望搜索的字符串I 搜索的开始位置,默认为1J 出现的位置,默认为1SQL select instr(oracle traning,ra,1,2) instring from dual; INSTRING-9INSTR方法的格式为INSTR(源字符串, 目标字符串, 起始位置, 匹配序号)例如:INSTR(CORPORATE FLOOR,OR,

5、3, 2)中,源字符串为CORPORATE FLOOR, 目标字符串为OR,起始位置为3,取第2个匹配项的位置。默认查找顺序为从左到右。当起始位置为负数的时候,从右边开始查找。所以SELECT INSTR(CORPORATE FLOOR, OR, -1, 1) Instring FROM DUAL的显示结果是Instring143. Oracle的DECODE()函数DECODE函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值

6、。区别于SQL的其它函数,DECODE函数还能识别和操作空值. 其具体的语法格式如下: DECODE(input_value,value,result,value,result,default_result); 其中: input_value 试图处理的数值。DECODE函数将该数值与一系列的序偶相比较,以决定最后的返回结果 value 是一组成序偶的数值。如果输入数值与之匹配成功,则相应的结果将被返回。对应一个空的返回值,可以使用关键字NULL于之对应 result 是一组成序偶的结果值 default_result 未能与任何一序偶匹配成功时,函数返回的默认值 下面的例子说明了,如何读取用

7、户CHECKUP表SEAPARK中的BLOOD_TEST_FLAG列下的项目,作为DECODE函数的实参支持值。 SELECT checkup_type, DECODE(blood_test_flag,Y,Yes,N,No,NULL,None,Invalid) FROM checkup;例如: selectdecode( x , 1 , x is 1 , 2 , x is 2 , others) from dual 当x等于1时,则返回x is 1。 当x等于2时,则返回x is 2。 否则,返回others。 需要,比较2个值的时候,可以配合SIGN()函数一起使用。 SELECT DECO

8、DE( SIGN(5 -6), 1 Is Positive, -1, Is Nagative, Is Zero) 同样,也可以用CASE实现: SELECT CASE SIGN(5 - 6) WHEN 1 THEN Is Positive WHEN-1 THEN Is Nagative ELSEIs Zero END FROM DUAL 此外,还可以在Order by中使用Decode。 例如:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。这时,就可以非常轻松的使用Decode完成要求了。 select * from table_subject

9、 order by decode(subject_name, 语文, 1, 数学, 2, , 外语,3)4.UNION 和UNION ALL 的区别在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果

10、,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。 从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下: select * from gc_dfys union all select * from ls_jg_dfys 5. 在SQL中如何显示字段为编号重复的记录?Select * From TabName1 AS a

11、 Where Exists(Select * From TabName1 AS b Where b.编号=a.编号 Group By 编号 having Count(*)1)6. MINUS关键字 两个查询语句相减SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果有的话,那这一笔记录就被去除,而不会在最后的结果中出现。如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃,其语法如下:SQL Segment 1MINUSSQL Segment 2其实简单的一

12、句话就是找出第一条SQL查询的不在第二条SQL语句查询结果中的那些记录,并且要注意最后返回的结果集中,不同的记录只会被列出一次!9.instr用法InStr( start, string1, string2 , compare )start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。 string1 必要参数。接受搜索的字符串表达式。 string2 必要参数。被搜索的字符串表达式。 Compare 可选参数。指定字符串比较。如果 compare

13、是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。 7.sql中exists 和 in 的区别exists只是返回有没有相同的记录,跟字段相不相同没有关系.exists返回的是true or false ,而不是记录集。 Exists代表存在量词,首先扫描外层查询的每一个元组,若对应内层查询非空,则外层查询的where后面条件为真,则取出外层相关元组;否则若对应内层查询为空,外层查询条件为假,则不取出该外层元祖。 对于表A的每一条数据,都执行select * from 表B where 表B.id=表A.id的存在性判断,如果表B中存在表

14、A当前行相同的id,则exists为真,该行显示,否则不显示。 exits适合内小外大的查询,in适合内大外小的查询。8. SQL用法小结1.模糊查询: select * from 表名 where 查询字段 like %biao_ %通配符-匹配任意字符_通配符-匹配单个字符2.字符串的连接(|): select 字段1 | , | 字段2 别名 from 表名输出: 字段1,字段23.查找非空项: select * from 表名 where 字段 is not null4.集合查询:union 返回两个查询的结果并去除其中的重复部分: select 字段1 from 表1 union select 字段1 from 表2union all 与 union 一样对表进行了合并但是它不去掉重复的记录: select 字段1 from 表1 union all select 字段1 from 表2intersect(相交) 返回两个表中共有的行: select 字段1 from 表1 intersect select 字段1 from 表2mimus(相减) 返回的记录是存在于第一个表中但不存在于第二个表中的记录例: select 字段1 from 表1 mi

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号