我想截取一段字符串得后几位  但是位数不固定,oracle  sql 需要怎么写
比如16_4253116201_3600*1*4这个字符串  有可能取后6位  后7位  后8位这个sql怎么写呢

解决方案 »

  1.   

    字符串的前半截如果固家,那么截取的目标字符串的起始位置就是确定的,截取的长度不确定,但长度可以根据长度和截取的位置进行计算。SUBSTR  截取子串语法: SUBSTR(string,a[,b])功能: 返回从a位置开始的b个字符长的string的一个子字符串. 第一个字符的位置是1. 如果a是0,那么它就被认为从第一个字符开始.如果是正数,返回字符是从左边向右边进行计算的.如果b是负数,那么返回的字符是从string的末尾开始从右向左进行计算的.如果b不存在,那么它将缺省的设置为整个字符串.如果b小于1,那么将返回NULL.如果a或b使用了浮点数,那么该数值将在处理进行以前首先被却为一个整数.使用位置:过程性语句和SQL语句。
      

  2.   

    楼上的计算方式可以,也可以用正则with tmp as
     (select '16_4253116201_3600*1*4' as p_str from dual)
    select regexp_substr(tmp.p_str,
                         '[^_]+',
                         1,
                         regexp_count(tmp.p_str, '[^_]+'))
      from tmp;
      

  3.   

    可以这样写, 不需要用count了
    WITH TMP AS
     (SELECT '16_4253116201_3600*1*4' AS P_STR FROM DUAL)
    SELECT REGEXP_SUBSTR(TMP.P_STR, '[^_]+$', 1, 1) FROM TMP;
      

  4.   

    可以这样写, 不需要用count了
    WITH TMP AS
     (SELECT '16_4253116201_3600*1*4' AS P_STR FROM DUAL)
    SELECT REGEXP_SUBSTR(TMP.P_STR, '[^_]+$', 1, 1) FROM TMP;
    谢谢~!执行结果我去试一下