Oracle中的wm_concat()函数、start with connect by prior、translate函数

最近看到Oracle中有一个很好用的查询,它就是start with connect by prior,说白了就是递归算法。

如果单表中存在树形结构,使用这个语句能提高效率。这语句不仅会查父级出来,还会查出整个树形结构。

1.START WITH

start with 子句为可选项,用来标识哪行作为查找树型结构的第一行(即根节点,可指定多个根节点)。若该子句被省略,则表示所有满足查询条件的行作为根节点。

2.关于PRIOR PRIOR置于运算符前后的位置,决定着查询时的检索顺序。

2.1 从根节点自顶向下

--sql 1
select empno, mgr, level as lv
from scott.emp a
start with mgr is null
connect by (prior empno) = mgr
order by level;

2.1 从根节点自底向上

--sql 2
select empno, mgr, level as lv
from scott.emp a
start with empno = 7876
connect by (prior mgr ) = empno
order by level;

translate函数

语法:TRANSLATE(char, from, to)

用法:返回将出现在from中的每个字符替换为to中的相应字符以后的字符串。

        若from比to字符串长,那么在from中比to中多出的字符将会被删除。
        三个参数中有一个是空,返回值也将是空值。

举例:SQL> select translate('abcdefga','abc','wo') 返回值 from dual;

        返回值
        -------
        wodefgw

分析:该语句要将'abcdefga'中的'abc'转换为'wo',

        由于'abc'中'a'对应'wo'中的'w',
        故将'abcdefga'中的'a'全部转换成'w';
        而'abc'中'b'对应'wo'中的'o',
        故将'abcdefga'中的'b'全部转换成'o';
        'abc'中的'c'在'wo'中没有与之对应的字符,
        故将'abcdefga'中的'c'全部删除;
        简单说来,就是将from中的字符转换为to中与之位置对应的字符,
        若to中找不到与之对应的字符,返回值中的该字符将会被删除。
        在实际的业务中,可以用来删除一些异常数据,
        比如表a中的一个字段t_no表示电话号码,
        而电话号码本身应该是一个由数字组成的字符串,
        为了删除那些含有非数字的异常数据,
        就用到了translate函数:
        SQL> delete from a,
                  where length(translate(trim(a.t_no),
                                        '0123456789' || a.t_no,
                                        '0123456789')) <> length(trim(a.t_no));

wm_concat()函数

博主最近在学习使用oracle,前几天写代码的时候有一个任务,查询到某一列的合并数据并且要求不能相同,我在网上查了查原来可以使用wm_concat()这个函数来实现。

一、wm_concat()函数是oracle中独有的,mysql中有一个group_concat()函数。

这两个函数的作用是相同的,它们的功能是:实现行转列功能,即将查询出的某一列值使用逗号进行隔开拼接,成为一条数据。

下面我们就来实现一下:

image

posted @ 2021-06-07 10:54  昨天的小冉  阅读(300)  评论(0编辑  收藏  举报