如何在oracle中删除破折号后的文本?

时间:2011-06-01 13:58:52

标签: sql regex oracle

我在看

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

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

帮我删除短划线后的所有字符,但我找不到符合我想要的功能或表达方式。这样做有什么好的oracle表达式?

ABC-DEF => ABC

5 个答案:

答案 0 :(得分:5)

我只想使用substr来完成破折号:

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

答案 1 :(得分:4)

使用正则表达式执行此操作:

regexp_replace('ABC-DEF', '-.*')

答案 2 :(得分:3)

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

答案 3 :(得分:0)

select substr('hello-dolly', 1, instr('hello-dolly', '-')-1) from dual

答案 4 :(得分: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字段('Hello-Dolly',' - ',1,2)Entire_string           ,field('Hello-Dolly',' - ',1,1)First_part           ,field('Hello-Dolly',' - ',2,1)Second_part       FROM dual;