【问题标题】:How to remove text following a dash in oracle?如何在oracle中删除破折号后的文本?
【发布时间】:2011-06-01 13:58:52
【问题描述】:

我在看

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

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

帮助我删除破折号后的所有字符,但我无法找到与我想要做的匹配的好的函数或表达式。有什么好的 oracle 表达式可以做到这一点?

ABC-DEF => ABC

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    我只会使用 substr 来完成所有内容:

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

    【讨论】:

      【解决方案2】:

      使用正则表达式:

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

      【讨论】:

        【解决方案3】:
        SUBSTR('ABC-DEF', 1, INSTR('ABC-DEF', '-')-1)
        

        【讨论】:

          【解决方案4】:
          select substr('hello-dolly', 1, instr('hello-dolly', '-')-1) from dual
          

          【讨论】:

            【解决方案5】:

            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 field('Hello-Dolly', '-', 1, 2) Entire_string ,field('Hello-Dolly', '-', 1, 1) First_part ,field('Hello-Dolly', '-', 2, 1) Second_part 从双;

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-08-25
              • 1970-01-01
              • 1970-01-01
              • 2023-01-23
              • 2014-10-01
              • 2014-09-10
              • 2017-03-06
              • 2011-02-12
              相关资源
              最近更新 更多