string - 部分比较两个 varchar2

标签 string plsql compare substring

我必须在 PL/SQL 中比较两个 Varchar2,但是以 3 个字符的块为单位。例如,以下两个字符串:“Synch ron ize”和“f ron t”将匹配,因为两者都包含子字符串“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)

关于string - 部分比较两个 varchar2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52257261/

相关文章:

r - 比较两列组并返回索引匹配 R

java - 在 java 中比较两个 ArrayLists 时出错

java/android NullPointerException 在字符串上抛出

Bash 用子 shell 和子字符串进行错误替换

c# - 将 C# 字符串分析为不同的变量

ruby-on-rails - Rails 3 UTF-8 查询字符串出现在 URL 中?

oracle - 在 sqlplus 中执行时将 plsql 错误消息重定向到日志文件

javascript - 通过比较 Javascript 中的 2 个数组来查找丢失的元素

database - 创建了用户,那么现在谁拥有创建的表?

sql - Oracle PLS-00103 错误。您如何检查现有记录并根据该条件进行更新或插入?