2015-03-19 160 views

回答

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 
+0

謝謝你爲我工作:) – 2015-03-19 09:24:51

0

你可以簡單地使用SUBSTRINSTR

例如,

這裏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> 
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()更清晰,但是你需要圍繞正則表達式進行研究,最終當你需要進行更復雜的模式匹配時,這會給你更多的權力。

相關問題