改bug的时候遇到了一个树状查找的问题,还不知道sql语句里面还有这么多的函数可以使用,想想自己学过的,真是太少了......
暂且不感慨了,对用到的几个函数做一下总结吧!!
树状查找应该挺好理解的,你可以想象到树的样子,也就是说在数据库查找的中间数据相互之间是首尾相关联,下面举简单例子说明:
假设有一个表Animal,里面的字段和数据如下
主键ID A_ID Animal名称 P_ID
001 001 猫类 001
002 002 狗类 002
003 003 波斯猫 001
004 004 安哥拉猫 001
005 005 大狗 002
006 006 小狗 002
在另一张表通过主键ID或者A_ID关联,存储一下数据:
主键ID A_ID Amount
001 003 9
002 004 10
003 005 9
004 006 8
假如要求分别查找狗类和猫类的数量,或许你觉得直接用sql也行啊,直接先用select,然后sum()求和就好了。
现在数据量量小,你可以根据A_ID和P_ID的值写出来,但是当数据量达到上百、上千的时候,还不写死人呀.....树状查找基本就是针对这种情况进行递归查找,写起来方便,至于效率我倒是没有测试过。
下面进入正题:
substr(string,start,length):表示从string中的第start个位置开始截取长度为length的字符串;
例如:对于字符串str='123456',substr(str,1,3),则返回的结果为123;substr(str,-3,2),则返回的结果为45;
值得注意的就是当start为负值的时候,字符串截取起始位置为倒数第start个位置,但是截取的顺序依然是从左向右;但是length的值必须为正的!!
sys_connect_by_path和start with......connect by prior:这两个都是针对树状结构的才可以使用,并且一般都是一起使用,当然也不是分开不可以;简单说一下语法:
sys_connect_by_path(str,sepearator):str表示字符串,sepearator为分隔符,就是将指定的字符串用指定的分隔符分隔开显示,针对上面的表结构进行示例