Oracle - 正则表达式 - 继续减少char以匹配另一列

问题描述 投票:-1回答:2

我从2个不同的表中有2列 - 比如columnA和columnB,我相互匹配。但是,如果它们不匹配,那么我想从columnB中删除最后一个char并再次与columnA匹配。如果它仍然不匹配,那么从columnB最后减少一个char并尝试匹配。继续从columnB减少chars直到匹配(并且直到columnB变为0长度)。

Ex - ColumnA的值为“ABC”,columnB的值为“ABCDEF”。然后,由于“ABC”不等于“ABCDEF”,尝试将“ABCDE”与“ABC”匹配。由于它不匹配,所以尝试“ABCD”。由于仍然没有匹配,请尝试“ABC”。现在有比赛,所以停!

我无法在Oracle中使用正则表达式来处理此问题。我可以使用substr / length和一堆“OR”条件但我宁愿避免使用正则表达式,这可以很好地完成。

提前致谢。

regex oracle
2个回答
0
投票
SELECT *
FROM   table_name
WHERE  REGEXP_LIKE( columnb, '^'||columna||'.*$' );

(但是,当columna包含^$.*+?|[]{}()\字符时,这会出现问题)。

要么

SELECT *
FROM   table_name
WHERE  columnb LIKE columna||'%';

要么

SELECT *
FROM   table_name
WHERE  INSTR( columnb, columna ) = 1;

要么

SELECT *
FROM   table_name
WHERE  SUBSTR( columnb, 1, LENGTH( columna ) ) = columna;

0
投票

我的猜测可能是你想要找到两个字符串的最长前缀。 在我看来,在PL / SQL中比在SQL中更容易:

create or replace function longest_prefix(a varchar2, b varchar2) return varchar2 as
    l number :=least(length(a), length(b));
    l_common varchar2(32767) :=substr(a,1,l);
begin
    for i in 1..l loop
        if substr(a,i,1)!=substr(b,i,1) then
            l_common:=substr(a,1,i-1);
            exit;
        end if;
    end loop;
    return l_common;
end;
/

测试:

SQL> select longest_prefix('asdf', 'as23') from dual;

LONGEST_PREFIX('ASDF','AS23')
--------------------------------------------------------------------------------
as
© www.soinside.com 2019 - 2024. All rights reserved.