Oracle中的substr()函数 详解及应用

 1、substr函数格式   (俗称:字符截取函数)

  格式1: substr(string string, int a, int b);

  格式2:substr(string string, int a) ;

解释:

    格式1:
        1、string 需要截取的字符串
        2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
        3、b 要截取的字符串的长度

    格式2:
        1、string 需要截取的字符串
        2、a 可以理解为从第a个字符开始截取后面所有的字符串。

2、实例解析

格式1:

Oracle中的substr()函数 详解及应用
 1select substr('HelloWorld',0,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符
 2select substr('HelloWorld',1,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符
 3、select substr('HelloWorld',2,3) value from dual; //返回结果:ell,截取从“e”开始3个字符
 4、select substr('HelloWorld',0,100) value from dual; //返回结果:HelloWorld,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最大数量返回。
 5select substr('HelloWorld',5,3) value from dual; //返回结果:oWo
 6select substr('Hello World',5,3) value from dual; //返回结果:o W (中间的空格也算一个字符串,结果是:o空格W)
 7select substr('HelloWorld',-1,3) value from dual; //返回结果:d (从后面倒数第一位开始往后取1个字符,而不是3个。原因:下面红色 第三个注解)
 8select substr('HelloWorld',-2,3) value from dual; //返回结果:ld (从后面倒数第二位开始往后取2个字符,而不是3个。原因:下面红色 第三个注解)
 9select substr('HelloWorld',-3,3) value from dual; //返回结果:rld (从后面倒数第三位开始往后取3个字符)
10select substr('HelloWorld',-4,3) value from dual; //返回结果:orl (从后面倒数第四位开始往后取3个字符)
Oracle中的substr()函数 详解及应用

    (注:当a等于0或1时,都是从第一位开始截取(如:1和2)
    (注:假如HelloWorld之间有空格,那么空格也将算在里面(如:5和6)
    (注:虽然7、8、9、10截取的都是3个字符,结果却不是3 个字符; 只要 |a| ≤ b,取a的个数(如:7、8、9);当 |a| ≥ b时,才取b的个数,由a决定截取位置(如:9和10)

格式2:

Oracle中的substr()函数 详解及应用
11、select substr('HelloWorld',0) value from dual;  //返回结果:HelloWorld,截取所有字符
12、select substr('HelloWorld',1) value from dual;  //返回结果:HelloWorld,截取所有字符
13、select substr('HelloWorld',2) value from dual;  //返回结果:elloWorld,截取从“e”开始之后所有字符
14、select substr('HelloWorld',3) value from dual;  //返回结果:lloWorld,截取从“l”开始之后所有字符
15select substr('HelloWorld',-1) value from dual;  //返回结果:d,从最后一个“d”开始 往回截取1个字符
16select substr('HelloWorld',-2) value from dual;  //返回结果:ld,从最后一个“d”开始 往回截取2个字符
17select substr('HelloWorld',-3) value from dual;  //返回结果:rld,从最后一个“d”开始 往回截取3个字符 
Oracle中的substr()函数 详解及应用

    (注:当只有两个参数时;不管是负几,都是从最后一个开始 往回截取(如:15、16、17)

 3、实例截图:

例1、

Oracle中的substr()函数 详解及应用

例2、

Oracle中的substr()函数 详解及应用

例5、

Oracle中的substr()函数 详解及应用

例6、

Oracle中的substr()函数 详解及应用

例7、

Oracle中的substr()函数 详解及应用

例8、

Oracle中的substr()函数 详解及应用

例9、

Oracle中的substr()函数 详解及应用

例10、

Oracle中的substr()函数 详解及应用

例15、

Oracle中的substr()函数 详解及应用

例16、

Oracle中的substr()函数 详解及应用

例17、

Oracle中的substr()函数 详解及应用

 4)完整函数实例

Oracle中的substr()函数 详解及应用
 1 create or replace function get_request_code return varchar2 AS
 2 
 3  -- 函数的作用:自动生成单号
 4  v_mca_no   mcode_apply.mca_no%TYPE;
 5 
 6  CURSOR get_max_mca_no IS   
 7      SELECT max(substr(mca_no, 11, 3)) -- 查出的最大单号,截取出最后三位,如:001、002...00n
 8      FROM  mcode_apply 
 9      WHERE  substr(mca_no, 3, 8) = to_char(sysdate, 'YYYYMMDD'); -- 截取单号【如:20170422】,to_char():把时间转换为字符型,即string类型。
10 
11  v_requestcode VARCHAR2(3);
12 
13  BEGIN
14     OPEN get_max_mca_no; 
15     FETCH get_max_mca_no INTO v_requestcode; 
16     CLOSE get_max_mca_no;
17 
18  IF v_requestcode IS NULL THEN         
19    v_requestcode := NVL(v_requestcode, 0);  -- NVL()函数:当v_requestcode为NULL时,取0作为值
20  END IF;
21 
22    v_requestcode:= lpad(v_requestcode+1,3,'0'); -- 将游标中截取到的值加1,然后向左填充0,生成 001,002...00n 三位数的 序号; lpad()函数:向左填充
23    v_mca_no:='MA'||to_char(sysdate,'YYYYMMDD')||v_requestcode; -- 最终生成的申请单号(如:MA20170422001;MA20170422002;...MA2017042200N )
24  
25  RETURN '0~,'||v_mca_no; 
26 
27 END ;
Oracle中的substr()函数 详解及应用

 注:如要测试该函数,请复制到oracle数据库中,右击函数名 “get_request_code” 选择test测试,测试时记得把相应的表名及字段换成自己建立的

原文出自:http://www.cnblogs.com/dshore123/p/7805050.html