一尘不染

存储过程最大模式匹配

sql

这是我在Oracle中的存储过程:

 CREATE OR REPLACE PROCEDURE execute_cproc (  callnum IN VARCHAR2
                                            , RESULT  OUT VARCHAR2)
 AS
   vara_val NUMBER;
   varb_val NUMBER;
 BEGIN
   SELECT a_val, b_val
     INTO vara_val, varb_val
     FROM data_table
    WHERE callnum LIKE numberpattern || '%';
 END;

如果CALLNUM是03354123,那么我得到2个结果:

  1. 03354123 like 033%

  2. 03354123 like 03354%

两者都是正确的,所以我得到2个结果。

如何使程序仅找到最长的匹配,即03354123 like 03354%

桌子 :

表名称:DATA_TABLE

列:

NumberPattern (varchar2) : 033, 03354

a_val ( integer ) : 1, 2

b_val ( integer ) : 1, 2

阅读 128

收藏
2021-05-23

共1个答案

一尘不染

您必须重组查询。如果要获得最佳或最大模式,请执行以下操作:

  select  a_val, b_val 
  into vara_val, varb_val 
  from 
      (select NumberPattern , 
              a_val,
               b_val,
               rank() over(order by length(NumberPattern) desc) ranking 
         from DATA_TABLE  
         where CALLNUM  like NumberPattern  || '%' ) 
         where ranking = 1

这会将变量vara_val和varb_val分别设置为值2、2。或者,如果您也想获取该模式,只需声明另一个将保存该值的变量,然后将查询编辑为此:

    select  NumberPattern ,a_val, b_val 
    into yournew_variable,vara_val, varb_val 
    from 
      (select NumberPattern , 
              a_val,
               b_val,
               rank() over(order by length(NumberPattern) desc) ranking 
         from DATA_TABLE  
         where CALLNUM  like NumberPattern  || '%' ) 
         where ranking = 1

这是一个简短的解释:我创建了一个子查询,该子查询由NumberPattern,a_val,b_val和根据其长度的NumberPattern的等级组成。这只会对您提供的CALLNUM参数上存在的模式进行排名。因此,例如,您获得了模式12345、1234,789,并将123456789传递给了CALLNUM参数,由于您的CALLNUM以12345和1234开头,而不是789,因此它将仅对模式12345和1234进行排名。排名为1的子查询中的NumberPattern,a_val和b_val

2021-05-23