2011-06-01 71 views
2

我看着如何在oracle中刪除短劃線之後的文本?

replace('ABC-DEF', '-') 

regexp_replace('ABC-DEF', '-$') 

幫我刪除破折號後的所有字符,但我一直沒能找到一個很好的功能或表達式匹配什麼,我想做。什麼是一個很好的oracle表達呢?

ABC-DEF => ABC 

回答

3
SUBSTR('ABC-DEF', 1, INSTR('ABC-DEF', '-')-1) 
5

我只想用SUBSTR得到一切直到破折號:

select substr(str, 1, instr(str, '-')-1) new_str 
from 
(
    select 'ABC-DEF' str 
    from dual 
) 
4

要使用正則表達式做到這一點:

regexp_replace('ABC-DEF', '-.*') 
0
select substr('hello-dolly', 1, instr('hello-dolly', '-')-1) from dual 
0

SELECT REGEXP_REPLACE ('ABC-DEF','[ - ] ',NULL)FROM dual; SELECT'regexp_replace('ABC-DEF-GHI-JKL','[ - ]',NULL)FROM dual;

,或者使用了冷靜函數調用FIELD:

CREATE OR REPLACE FUNCTION field(i_string   VARCHAR2 
           ,i_delimiter   VARCHAR2 
           ,i_occurance   NUMBER 
           ,i_return_number  NUMBER DEFAULT 0 
           ,i_replace_delimiter VARCHAR2 DEFAULT NULL) RETURN VARCHAR2 IS 
    v_return_string VARCHAR2(32767); 
    n_start   NUMBER := i_occurance; 
    v_delimiter  VARCHAR2(1); 
    n_return_number NUMBER := i_return_number; 
    n_max_delimiters NUMBER := regexp_count(i_string, i_delimiter); 
BEGIN 
    IF i_return_number > n_max_delimiters THEN 
    n_return_number := n_max_delimiters + 1; 
END IF; 
    FOR a IN 1 .. n_return_number LOOP 
    v_return_string := v_return_string || v_delimiter || regexp_substr(i_string, '[^' || i_delimiter || ']+', 1, n_start); 
    n_start   := n_start + 1; 
    v_delimiter  := nvl(i_replace_delimiter, i_delimiter); 
    END LOOP; 
    RETURN(v_return_string); 
END field; 

用法: SELECT場( '你好,多莉', ' - ',1,2)Entire_string ,現場( '你好,多莉', ' - ',1,1)First_part ,字段('Hello-Dolly',' - ',2,1)Second_part FROM dual;

相關問題