查找子串直到最后一次出现

时间:2015-03-19 09:21:02

标签: sql oracle plsql

我想获取字符串的子字符串,如:filename_ip_time.pdf 我想选择filename_ip,这是直到最后一次出现'_'

的字符串

3 个答案:

答案 0 :(得分:3)

使用-1作为INSTR的起始位置,从字符串末尾开始搜索:

select INSTR('filename_ip_time.pdf', '_', -1) from dual

因此,如果你想选择filename_ip,你应该这样做:

SELECT   SUBSTR ('filename_ip_time.pdf',
                 0,
                 (INSTR ('filename_ip_time.pdf', '_', -1)) - 1)
  FROM   DUAL

答案 1 :(得分:1)

使用REGEXP_REPLACE()进行参数的另一种方法:

SQL> select regexp_replace('filename_ip_time.pdf', '^(.*)_.*$', '\1') from dual;

REGEXP_REPL
-----------
filename_ip

SQL>

正则表达式可以读作: 返回模式匹配的第一个记住的组(\ 1):

^  Start of the line
(  start the first group to remember
.  any character
*  any number of the previous character (any character)
)  end the first group, followed by
_  A literal underscore
.*  followed by any number of any characters 
$  until the end of the line.

所以从本质上讲,你将返回字符串的第一部分,但不包括最后一个下划线,后面是其余部分。对我来说,比嵌套的substr()和instr()更清晰,但你需要了解正则表达式,当你需要做更复杂的模式匹配时,这将最终给你更多的力量。

答案 2 :(得分:0)

您只需使用 SUBSTR INSTR 即可。

例如,

  

此处INSTR将从最后给出_的第一个位置。

SQL> WITH DATA AS(
  2  SELECT 'filename_ip_time.pdf' str FROM dual
  3  )
  4  SELECT SUBSTR(str, 1, instr(str, '_', -1, 1) -1) FROM DATA
  5  /

SUBSTR(STR,
-----------
filename_ip

SQL>

或者,

  

如果您知道在第二次出现_之前需要substr,那么请使用INSTR从一开始就获取第二次出现_的位置。

例如,

 SQL> WITH DATA AS(
  2  SELECT 'filename_ip_time.pdf' str FROM dual
  3  )
  4  SELECT SUBSTR(str, 1, instr(str, '_', 1, 2) -1) FROM DATA
  5  /

SUBSTR(STR,
-----------
filename_ip

SQL>