如何更有效地找到 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 中分隔符之间的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章