如何更有效地找到 PL/SQL 中分隔符之间的子字符串?

Posted

技术标签:

【中文标题】如何更有效地找到 PL/SQL 中分隔符之间的子字符串?【英文标题】:How more effectively find the substrings between the separator in PL/SQL? 【发布时间】:2015-03-16 18:52:31 【问题描述】:

现在我这样做:

declare
    str varchar2(1000) := '1a2b3c / a1b2c3';
begin
    dbms_output.enable;
    dbms_output.put_line( regexp_replace(str, '(.*) / .*', '\1') );--1a2b3c 
    dbms_output.put_line( regexp_replace(str, '.* / (.*)', '\1') );--a1b2c3
end;

我怎样才能以不同的方式做到这一点?

我怎样才能更有效地做到这一点?

【问题讨论】:

【参考方案1】:

使用INSTR() 并查找/

DECLARE
    str varchar2(1000) := '1a2b3c / a1b2c3';
BEGIN
    DBMS_OUTPUT.ENABLE;
    DBMS_OUTPUT.PUT_LINE( TRIM( SUBSTR(str, 1, INSTR(str, '/') - 1) ) );
    DBMS_OUTPUT.PUT_LINE( TRIM( SUBSTR(str, INSTR(str, '/') + 1, LENGTH(str) - INSTR(str, '/')) ) );
END;

您也可以使用REGEXP_SUBSTR(),但如果您不想使用REGEXP_REPLACE(),您可能根本不想使用正则表达式:

DBMS_OUTPUT.ENABLE;
DBMS_OUTPUT.PUT_LINE( TRIM( REGEXP_SUBSTR(str, '^[^\/]*') ) );
DBMS_OUTPUT.PUT_LINE( TRIM( REGEXP_SUBSTR(str, '[^\/]*$') ) );

【讨论】:

是的,这看起来确实更有效,尽管括号不匹配(1 短)您对 dbms_output.put_line 的调用(在您的第一种方法中)。【参考方案2】:

使用正则表达式:

WITH s AS (SELECT '1a2b3c / a1b2c3' txt, '[^/]+' regexp FROM DUAL)
SELECT REGEXP_SUBSTR (txt,
                      regexp,
                      1,
                      LEVEL)
  FROM s
CONNECT BY REGEXP_SUBSTR (txt,
                          regexp,
                          1,
                          LEVEL)
             IS NOT NULL;

【讨论】:

以上是关于如何更有效地找到 PL/SQL 中分隔符之间的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何从替换过程(PL/SQL)中获取旧代码?

如何在 PL/SQL 中解析逗号分隔的字符串? [复制]

PL/SQL 逗号分隔列表;删除重复并放入数组

PL/SQL 查询 IN 逗号分隔字符串

如何更有效地将词汇存储在数组中?

如何转换逗号分隔的 varchar 以用于 pl/sql 中的“IN”子句?