Oracle 如果包含子字符串(无论顺序如何),则比较字符串
假设我们有一个字符串,比如Oracle 如果包含子字符串(无论顺序如何),则比较字符串,oracle,plsql,Oracle,Plsql,假设我们有一个字符串,比如 AABBCCDDEEFFGG 它包含7个子字符串 AA BB CC DD EE FF GG 现在让我们重新组织顺序,只要新字符串包含子字符串,那么我们认为它们是相等的。新字符串是 AACCFFGGEEBBDD 只是把顺序改成了 AA CC FF GG EE BB DD 我有许多子字符串的组合。每个子字符串正好有两个字符。如何将长字符串与存储过程中的相同字符串进行比较?假设旧字符串来自数据库,新字符串来自输入参数。您可以创建一个函数来拆分字符串并比较字符串 CR
AABBCCDDEEFFGG
它包含7个子字符串
AA BB CC DD EE FF GG
现在让我们重新组织顺序,只要新字符串包含子字符串,那么我们认为它们是相等的。新字符串是
AACCFFGGEEBBDD
只是把顺序改成了
AA CC FF GG EE BB DD
我有许多子字符串的组合。每个子字符串正好有两个字符。如何将长字符串与存储过程中的相同字符串进行比较?假设旧字符串来自数据库,新字符串来自输入参数。您可以创建一个函数来拆分字符串并比较字符串
CREATE OR REPLACE FUNCTION compare_str (
p_str1 VARCHAR2,
p_str2 VARCHAR2
) RETURN INTEGER AS
TYPE strytype IS
TABLE OF VARCHAR2(100);
str_t1 strytype;
str_t2 strytype;
BEGIN
SELECT substr(p_str1, (level - 1) * 2 + 1,2) AS ch BULK COLLECT
INTO str_t1
FROM dual CONNECT BY
level <= length(p_str1) / 2
ORDER BY ch;
SELECT substr(p_str2, (level - 1) * 2 + 1,2) AS ch BULK COLLECT
INTO str_t2
FROM dual CONNECT BY
level <= length(p_str2) / 2
ORDER BY ch;
IF str_t1 = str_t2
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
/
您可以使用下面的功能
create or replace function str_comparison ( i_String1 varchar2, i_String2 varchar2 )
return pls_integer is
o_result pls_integer;
begin
with t(str1,str2) as
(
select i_String1, i_String2 from dual
), t2(s_str1,s_str2) as
(
select substr(str1,-2*level,2),
substr(str2,-2*level,2)
from t
connect by level <= length(str1)/2
), t3 as
(
select listagg(s_str1) within group ( order by s_str1 )
as str1,
listagg(s_str2) within group ( order by s_str2 )
as str2
from t2
)
select decode(str1,str2,1,0)
into o_result
from t3;
return o_result;
end;
请参见用AACCFFGGEEBBDD和AABBCCDDEEFFGG替换参数yield 1,该参数表示由于逻辑原因,无论何时排序,这些字符串都是相同的,否则将得到0零。如何定义子字符串?是不是只有两个连续的字符?是的,没错,非常感谢。
create or replace function str_comparison ( i_String1 varchar2, i_String2 varchar2 )
return pls_integer is
o_result pls_integer;
begin
with t(str1,str2) as
(
select i_String1, i_String2 from dual
), t2(s_str1,s_str2) as
(
select substr(str1,-2*level,2),
substr(str2,-2*level,2)
from t
connect by level <= length(str1)/2
), t3 as
(
select listagg(s_str1) within group ( order by s_str1 )
as str1,
listagg(s_str2) within group ( order by s_str2 )
as str2
from t2
)
select decode(str1,str2,1,0)
into o_result
from t3;
return o_result;
end;