我从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”条件但我宁愿避免使用正则表达式,这可以很好地完成。
提前致谢。
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;
我的猜测可能是你想要找到两个字符串的最长前缀。 在我看来,在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