部分比较两个varchar2
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部分比较两个varchar2相关的知识,希望对你有一定的参考价值。
我必须在PL / SQL中比较两个Varchar2,但是以3个字符为单位。例如,以下两个字符串:“Synchronize”和“front”匹配,因为它们都包含子字符串“ron”。
为了解决这个问题,我可以得到第一个字符串的三个连续字符的所有块,并在第二个字符串中查找它们中的任何一个。
我的问题:是否有更简单/优化的解决方案在PL / SQL中获得相同的结果?
提前致谢。
下面,您可以找到一个代码示例,如果匹配,v_found将包含大于0的值:
DECLARE
v_string1 VARCHAR2(30) := '1234567';
v_string2 VARCHAR2(30) := 'abcd345efg';
v_substring VARCHAR2 (100);
v_len PLS_INTEGER;
v_found PLS_INTEGER;
BEGIN
v_len := LENGTH(v_string1);
IF (v_len > 2 ) THEN
FOR i IN 1 .. v_len - 2
LOOP
v_substring := SUBSTR( v_string1, i, 3 );
dbms_output.put_line( v_substring );
v_found := INSTR( v_string2, v_substring );
dbms_output.put_line( 'v_string2<' || v_string2 || '>, v_substring<' || v_substring || '>, v_found <' || v_found || '>' );
END LOOP;
END IF;
END;
答案
假设你有一个字符串,你需要得到3个字符的所有子串;这可能是一种方式:
select substr(string1, level, 3)
from (select '1234567' string1 from dual)
connect by level +2 <= length(string1);
SUBSTR(STRING1,LEVEL,3)
--------------------------------
123
234
345
456
567
您可以使用它来从两个字符串中获取所有子字符串,然后使用JOIN
进行检查:
DECLARE
v_string1 VARCHAR2(30) := '1234567';
v_string2 VARCHAR2(30) := 'abcd345efg';
v_check number;
BEGIN
select count(*)
into v_check
from (
select substr(v_string1, level, 3) token
from dual
connect by level +2 <= length(v_string1)
) tokens_1
inner join
(
select substr(v_string2, level, 3) token
from dual
connect by level +2 <= length(v_string2)
) tokens_2
on (tokens_1.token = tokens_2.token);
if v_check = 1 then
dbms_output.put_line('MATCH');
else
dbms_output.put_line('NO MATCH');
end if;
END;
更紧凑的方式可能是:
select case when max(instr(string2, substr(string1, level, 3))) = 0
then 'NO MATCH'
else 'MATCH'
end
from (select '1234567' string1, 'abcd345efg' string2 from dual)
connect by level +2 <= length(string1)
以上是关于部分比较两个varchar2的主要内容,如果未能解决你的问题,请参考以下文章