ORACLE 截取函数,从右侧开始,往左侧截取如何写?

想实现Oracle从右侧开始往左侧截取

例:原始数据:00D51E31

从右侧第三位E开始截取,从右侧往左侧数,一直截取到左侧第一位字符串

 截取后显示结果:00D51E

使用SUBSTR(00D51E31,-3,5) 函数,截取结果显示E31,不是想要的结果。

原始数据字符串长度不一致,请问如何实现?

 

substr的第三个参数都是从第二个参数的位置从左往右数,因此你这个需求应该进行转化,截取的逻辑应该为从左起第一位,截到倒数第3位,即字符串总长度减2的长度

substr('00D51E31',1,length('00D51E31')-2)

img

Oracle 截取字符串

  1. SUBSTR:取子字符串,从“起始位置”开始,取“多少"个,当起始位置为负数的时候,从右边开始查找。
    SUBSTR(源字符串,起始位置,要取多少位)
    例:Select SUBSTR('ORC+001',1,3) From dual; 返回的是“ORC”
    Select SUBSTR('ORC+001',-5,3) From dual; 返回的是“ORC”
  2. INSTR:默认查找顺序为从左到右。当起始位置为负数的时候,从右边开始查找。INSTR(源字符串, 目标字符串, 起始位置, 匹配序号)
    例:Select INSTR('ORC+001','+',1,1) From dual ;
    返回的是"4",如果该字符串没有匹配字符返回的是“0”。

测试了,貌似都是往右边截取。 正负只是从左还是右开始算开始位置而已
需要根据你的要求用instr 算开始位置。

改下写法 ,

-- 右侧3开始 
select SUBSTR('00D51E31',0,length('00D51E31')-3) From dual;

-- 右侧5开始 
select SUBSTR('00D51E31',0,length('00D51E31')-5) From dual;