假设我们有一个字符串,例如
AABBCCDDEEFFGG
它包含7个子字符串
AA BB CC DD EE FF GG
现在,只要新字符串包含子字符串,我们就可以重新组织顺序,那么我们认为它们是相等的。新的字符串是
AACCFFGGEEBBDD
它只是将顺序更改为
AA CC FF GG EE BB DD
我有许多来自子字符串的组合。每个子字符串都恰好有两个字符。如何在存储过程中将长字符串进行比较?假设旧字符串来自数据库,新字符串来自输入参数。
答案 0 :(得分:1)
您可以创建一个将字符串分割并比较字符串的函数。
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;
/
因此,在查询或过程中,您可以简单地调用传递适当的列/字符串作为参数的函数。
select compare_str('AABBCCDDEEFFGG','AACCFFGGEEBBDD') from dual;
1
答案 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;
,请参见用替换AACCFFGGEEBBDD
和AABBCCDDEEFFGG
替换参数yield 1
,显示由于逻辑原因,这些字符串在每次排序时都是相同的,否则得到0
(零)。