Oracle高级函数

http://www.cnblogs.com/chen1388/archive/2010/07/06/1771919.html

decode函数:

decode(aa, 1, ‘xs‘, 2, ‘ps‘, ‘ms‘)

相当于

(case aa when 1 then ‘xs‘

when 2 then ‘ps‘

else ‘ms‘

end)

http://www.cnblogs.com/chen1388/archive/2010/07/06/1771930.html

trunc函数,截断函数

for date : TRUNC(TO_DATE(‘24-Nov-1999 08:00 pm‘),‘dd-mon-yyyy hh:mi am‘)

for number: 与round类似,但不进行四舍五入

TRUNC(89.985,2)=89.98

TRUNC(89.985)=89

TRUNC(89.985,-1)=80

http://www.cnblogs.com/chen1388/archive/2010/09/25/1834827.html

connect by prior 递归算法

Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: 
select ... from tablename start with 条件1 
connect by 条件2 
where 条件3; 
例:
select * from table 
start with org_id = ‘HBHqfWGWPy‘ 
connect by prior org_id = parent_id;

简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: 
org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 
     用上述语法的查询可以取得这棵树的所有记录。 
     其中: 
     条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 
     条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。 
     条件3 是过滤条件,用于对返回的所有记录进行过滤。

简单介绍如下: 
     早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下: 
     第一步:从根节点开始; 
     第二步:访问该节点; 
     第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步; 
     第四步:若该节点为根节点,则访问完毕,否则执行第五步; 
     第五步:返回到该节点的父节点,并执行第三步骤。

总之:扫描整个树结构的过程也即是中序遍历树的过程。

1. 树结构的描述 
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如EMP表中的EMPNO和MGR。EMPNO表示该雇员的编号,MGR表示领导该雇员的人的编号,即子节点的MGR值等于父节点的EMPNO值。在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每个节点的父节点,就可以确定整个树结构。 
在SELECT命令中使用CONNECT BY 和蔼START WITH 子句可以查询表中的树型结构关系。其命令格式如下: 
SELECT 。。。 
CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2} 
[START WITH]; 
其中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。 
START WITH: 不但可以指定一个根节点,还可以指定多个根节点。 
2. 关于PRIOR 
运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。 
PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如: 
CONNECT BY PRIOR EMPNO=MGR 
PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如: 
CONNECT BY EMPNO=PRIOR MGR 
在这种方式中也应指定一个开始的节点。 
3. 定义查找起始节点 
     在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。 
4.使用LEVEL 
在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。 
5.节点和分支的裁剪 
在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。 
6.排序显示 
象在其它查询中一样,在树结构查询中也可以使用ORDER BY 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序

http://www.uncletoo.com/html/oracle/850.html

listagg 函数(11g开始支持)。合并多行

用法:SELECT FID, FType,LISTAGG(FName, ‘,’) WITHIN GROUP (ORDER BY FName) AS FName

      FROM TABLENAME

     GROUP BY FID

oracle 10g中:

WITH AS

(

SELECT FID key, FName X FROM <table_name>

)

SELECT KEY,

RTRIM(

XMLAGG (XMLELEMENT(e, x||’, ‘) ORDER BY x).EXTRACT(‘//text()’)

AS concatval

FROM q

GROUP BY KEY

聚合多行:

Sql代码  

  1. with temp as(
  2. select ‘China‘ nation ,‘Guangzhou‘ city from dual union all
  3. select ‘China‘ nation ,‘Shanghai‘ city from dual union all
  4. select ‘China‘ nation ,‘Beijing‘ city from dual union all
  5. select ‘USA‘ nation ,‘New York‘ city from dual union all
  6. select ‘USA‘ nation ,‘Bostom‘ city from dual union all
  7. select ‘Japan‘ nation ,‘Tokyo‘ city from dual
  8. )
  9. select nation,listagg(city,‘,‘) within GROUP (order by city)
  10. from temp
  11. group by nation

这是最基础的用法:

LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX)

用法就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来。

非常方便。

同样是聚合函数,还有一个高级用法:

就是over(partition by XXX)

也就是说,在你不实用Group by语句时候,也可以使用LISTAGG函数:

Sql代码  

  1. with temp as(
  2. select 500 population, ‘China‘ nation ,‘Guangzhou‘ city from dual union all
  3. select 1500 population, ‘China‘ nation ,‘Shanghai‘ city from dual union all
  4. select 500 population, ‘China‘ nation ,‘Beijing‘ city from dual union all
  5. select 1000 population, ‘USA‘ nation ,‘New York‘ city from dual union all
  6. select 500 population, ‘USA‘ nation ,‘Bostom‘ city from dual union all
  7. select 500 population, ‘Japan‘ nation ,‘Tokyo‘ city from dual
  8. )
  9. select population,
  10. nation,
  11. city,
  12. listagg(city,‘,‘) within GROUP (order by city) over (partition by nation) rank
  13. from temp

总结:LISTAGG()把它当作SUM()函数来使用就可以了。

时间: 2024-10-05 05:00:26

Oracle高级函数的相关文章

Oracle高级函数1------ Oracle 树操作(select…start with…connect by…prior)

oracle树查询的最重要的就是select…start with…connect by…prior语法了.依托于该语法,我们可以将一个表形结构的以树的顺序列出来.在下面列述了oracle中树型查询的常用查询方式以及经常使用的与树查询相关的oracle特性函数等,在这里只涉及到一张表中的树查询方式而不涉及多表中的关联等. 1.准备测试表和测试数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

Oracle高级函数篇之递归查询start with connect by prior简单用法

路飞:" 把原来CSDN的博客转移到博客园咯!" 前段时间,自己负责的任务中刚好涉及到了组织关系的业务需求,自己用了oracle递归查询.下面简单来举个例子.在工作中我们经常会遇到有一定组织关系层次的关系.比如某个省下有多少市,每个市下又有多个区.再或者公司组织部门相互的隶属关系.这时我们就可能会用到 start with connect by prior 递归查询了 用法举例 1. 基本sql语法: select  ...   from  + 表   start with      

oracle 高级分组

oracle 高级分组 博客分类: 数据库基础 oraclesql Java代码   10.高级分组 本章目标: 对于增强的group by需要掌握: 1.使用rollup(也就是roll up累计的意思)操作产生subtotal(小计)的值. 2.使用cube操作产生cross-tabulation(列联交叉表)的值. 3.使用grouping函数标识通过rollup和cube建立的行的值. 4.使用grouping sets产生一个single result set(结果集). 5.使用gr

Oracle高级分组

/******************Oracle 高级分组*****************************/ /*-----------------auther:similarface-----------------------*/ /*--------------------2015年2月4日----------------------------*/ --oracle中GROUP BY中使用的列必须与select语句中没有使用聚合函数的列相匹配 /* Formatted on

oracle高级查询(实例基于scott用户四张表)

oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ======================================================================= scott用户的四张表(emp,dept,bonus,salgrade) 没有这四张表的可参考http://blog.csdn.net/love_legain/article/details/54311040进行创建 -----------------------

数据库编程1 Oracle 过滤 函数 分组 外连接 自连接

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> 数据库编程1 Oracle 过滤 函数 分组 外连接 自连接 本文实验基于的数据表: winsows安装好Oracle11g之后,开始实验 SQLplus 登陆 ORacle sqlplus 退出的方式 查看用户之下有什么表 查看表的所有记录,不区分大小写 设置SQLplus行宽,页宽,列宽: 清屏命令 select as 语法 1,as别名的使用 2,没有引号带有空格的别名,无法识别: 3,带有

数据库编程2 Oracle 过滤 函数 分组 外连接 自连接

[本文谢绝转载原文来自http://990487026.blog.51cto.com] 续:数据库编程1 Oracle 过滤 函数 分组 外连接 自连接 where like模糊查询,查询员工姓名是4个字母 SQL> select * from emp where ename like '____';      EMPNO ENAME                JOB                       MGR HIREDATE          SAL       COMM    

Oracle trunc()函数的用法

--Oracle trunc()函数的用法 /**************日期  TRUNC()函数没有秒的精确 ********************/ select sysdate from dual --当时日期 select trunc(sysdate) from dual select trunc(sysdate ,'DD') from dual --今天日期 select trunc(sysdate,'d')+7 from dual --本周星期日 select trunc(sys

Oracle高级队列介绍

原始链接:http://www.oracle-developer.net/display.php?id=411 oracle高级队列介绍 高级队列Advanced Queuing(AQ)在oracle多个版本都可得到.他是oracle原生消息软件并且在每一个版本都在加强. 这篇文章提供了一个AQ的高级概览.尤其是我们将看到如何启动一个队列并进行入列--出列操作,还有通过通知创建异步出列. 注意AQ支持数据库意外的消息监听(例如JMS消息队列).本文仅涉及数据库内部消息通信. 要求: 本例要求指定