zoukankan      html  css  js  c++  java
  • SQL Cookbook—字符串

    1、遍历字符串
    2、计算字符在字符串中出现的次数
    3、从字符串中删除不需要的字符
    4、将字符和数字数据分离
    5、判别字符串是不是字母数字型的
    6、提取姓名的大写首字母缩写
    7、按字符串中的部分内容排序
    8、按字符串中的数值排序
    9、根据表中的行创建一个分隔列表
    10、按字母顺序排列字符串
    11、判别可作为数值的字符串
    12、提取第n个分隔的子串
    13、分解IP地址

    1、遍历字符串
    1)、select * from t10 order by id asc;
            ID
    ———-
             1
             2
             3
             4
             5
             6
             7
             8
             9
            10
    2)、
    select substr(e.ename, iter.id, 1) as c
    from (select 'abcdefg' ename from dual) e,
         (select * from t10 order by id) iter
    where iter.id <= length(e.ename)
    说明,t10表只是个辅助表而已,书上称之为“基干表”。在这里有一点需要注意的就是这里的字符串'abcdefg'长度是小于10的,所以在这里使用t10可以实现我们的需求。假若字符串长度大于10,那么就不行了。所以我们应该保证基干表中的行数要大于字符串的长度才行。

    2、计算字符在字符串中出现的次数
    例如:'10,cleak,manager'计算在这字符串中有多少个逗号。
    思路:首先计算出原字符串的长度,然后计算去掉逗号后字符串的长度,这两者的差就是逗号在该字符串中出现的次数。
    区别:length求得是字符长度,lengthb求得是字节长度。
    方法一
    select lengthb('10,cleak,manager')-lengthb(replace('10,cleak,manager', ',', '')) count from dual;
    方法二
    select lengthb(translate('10,cleak,manager', ','||'10,cleak,manager', ',')) count from dual;
    方法三,适用于11g以上
    select regexp_count('10,cleak,manager', ',') count from dual;

    3、从字符串中删除不需要的字符
    例如,现在要求从ENAME列中删除元音字母(a,e,i,o,u),从SAL列中删除0。
    说明,REPLACE、TRANSLATE函数用法
    select ename,
           –先使用translate()把元音字母都转换为一个符号',',完了再使用replace去掉符号','
           replace(translate(ename, upper('aeiou'), ','), ',', '') as sub_ename,
           sal,
           replace(sal, 0, '') as sub_sal
      from emp;

    4、将字符和数字数据分离
    例如,select ename||sal as data from emp,现在要求把data分开为两列,字符部分一列,数字部分一列。
    说明,LPAD(String a, int length, String addString),作用:把addString添加到a的左边,length是返回值的长度。
    select replace(translate(data, '1234567890', '0000000000'), '0', '') as ename,
           to_number(replace(translate(lower(data),
                                       lower('abcdefghijklmnopqrstuvwxyz'),
                                       rpad('z', 26, 'z')),
                             'z',
                             '')) as sal
      from (select ename || sal as data from emp);

    5、判别字符串是不是字母数字型的
    create view V as
       select ename as data
       from emp
       where deptno=10
    union all
        select ename||', $'||cast(sal as varchar2(10))||'.00' as data
        from emp
        where deptno=20
    union all
        select ename||cast(sal as varchar2(20)) as data
        from emp
        where deptno=30

    现在要求查询出为字母数字型的行,也就是说4-8要去掉,因为其中除了字母和数字还包含了其他字符。
    select data
      from v
     where translate(lower(data),
                     '0123456789abcdefghijklmnopqrstuvwxyz',
                     rpad('z', 36, 'z')) = rpad('z', length(data), 'z');

    6、提取姓名的大写首字母缩写
    例如,Stewie Griffin,要返回结果如:S.G.

    select replace(replace(translate(replace('Stewie Griffin','.',''),
                                     'abcdefghijklmnopqrstuvwxyz',
                                     rpad('#',26,'#')),'#',''),
                   ' ',
                   '.')||'.'
    from dual

    7、按字符串中的部分内容排序
    select ename, substr(ename, length(ename)-1, 2) subename from emp order by substr(ename, length(ename)-1, 2)

    8、按字符串中的数值排序
    select data,
    to_number(replace(translate(data,replace(translate(data,'0123456789','##########'),'#'),rpad('#',20,'#')),'#')) num
    from V order by
    to_number(replace(translate(data,replace(translate(data,'0123456789','##########'),'#'),rpad('#',20,'#')),'#'))

    9、根据表中的行创建一个分隔列表
    SELECT DEPTNO, LTRIM(SYS_CONNECT_BY_PATH(ENAME, ','), ',') EMPS
      FROM (SELECT DEPTNO,
                   ENAME,
                   ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY EMPNO) RN,
                   COUNT(*) OVER(PARTITION BY DEPTNO) CNT
              FROM EMP)
     WHERE LEVEL = CNT
     START WITH RN = 1
    CONNECT BY PRIOR DEPTNO = DEPTNO
           AND PRIOR RN = RN – 1

    10、按字母顺序排列字符串
    ————————-
    ADAMS      AADMS
    ALLEN      AELLN
    BLAKE      ABEKL
    CLARK      ACKLR
    FORD       DFOR
    JAMES      AEJMS
    JONES      EJNOS
    KING       GIKN
    MARTIN     AIMNRT
    MILLER     EILLMR
    SCOTT      COSTT
    OLD_NAME   NEW_NAME

    sql语句
    SELECT OLD_NAME, NEW_NAME
      FROM (SELECT OLD_NAME, REPLACE(SYS_CONNECT_BY_PATH(C, ' '), ' ') NEW_NAME
              FROM (SELECT E.ENAME OLD_NAME,
                           ROW_NUMBER() OVER(PARTITION BY E.ENAME ORDER BY SUBSTR(E.ENAME, ITER.POS, 1)) RN,
                           SUBSTR(E.ENAME, ITER.POS, 1) C
                      FROM EMP E, (SELECT ROWNUM POS FROM EMP) ITER
                     WHERE ITER.POS <= LENGTH(E.ENAME)
                     ORDER BY 1)
             START WITH RN = 1
            CONNECT BY PRIOR RN = RN – 1
                   AND PRIOR OLD_NAME = OLD_NAME)
     WHERE LENGTH(OLD_NAME) = LENGTH(NEW_NAME);

    11、判别可作为数值的字符串

    12、提取第n个分隔的子串

    13、分解IP地址
    SELECT IP,
           SUBSTR(IP, 1, INSTR(IP, '.', 1, 1) – 1) A,
           SUBSTR(IP,
                  INSTR(IP, '.', 1, 1) + 1,
                  INSTR(IP, '.', 1, 2) – INSTR(IP, '.', 1, 1) – 1) B,
           SUBSTR(IP,
                  INSTR(IP, '.', 1, 2) + 1,
                  INSTR(IP, '.', 1, 3) – INSTR(IP, '.', 1, 2) – 1) C,
           SUBSTR(IP, INSTR(IP, '.', 1, 3) + 1) D
      FROM (SELECT '192.168.112.101' AS IP FROM DUAL);

  • 相关阅读:
    命令行界面下用户和组管理之groupadd的使用
    vue数据更新UI不刷新显示解决方案
    传入函数作为string.replace方法的第二个参数应用
    CSS 黑魔法-css控制图标颜色
    谈谈Web Components
    js函数组合
    “平滑滚动”效果骚操作
    BFC布局解析
    关于js构造函数return的一些解惑
    关于setTimeout和setInterval你不知道的事
  • 原文地址:https://www.cnblogs.com/linjiqin/p/3152576.html
Copyright © 2011-2022 走看看