2011-06-01 22 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;

相关问题