Sql 存储过程最大模式匹配

Sql 存储过程最大模式匹配,sql,oracle,stored-procedures,top-n,Sql,Oracle,Stored Procedures,Top N,这是我在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

这是我在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个结果:

03354123与033%相似

03354123与03354%相似

这两个都是真的,所以我得到了两个结果

如何使程序仅查找最长匹配,即03354123与03354%类似

表:

表名称:数据表

栏目:

NumberPattern (varchar2) : 033, 03354

a_val ( integer ) : 1, 2

b_val ( integer ) : 1, 2

您建议的解决方案是否提供了答案

如果您的数据包含:

03354121 03354122 03354123

这些都将符合03354%。那么哪一个是最好的呢

也许没有答案


一种修复方法是按降序对数据进行排序并选择第一个结果。

您可以这样做吗对不起,我没有Oracle DB可供测试:

select a_val, b_val into vara_val, varb_val
  from (
    select 
        a_val, b_val, NumberPattern, row_number() as r
    from 
        DATA_TABLE 
    where 
        CALLNUM LIKE NumberPattern || '%'
    order by NumberPattern  DESC)
where r = 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参数上存在的模式进行排序。例如,您得到了模式123451234789,并将123456789传递给您的CALLNUM参数,它将只对模式12345和1234进行排序,因为您的CALLNUM以12345和1234开始,而不是以789开始。一旦它被排名,我就从排名为1的子查询中选择了数字模式、a_val和b_val。请帮助。如果问题不清楚或有任何疑问,请告诉我“数字模式”是什么?“CALLNUM”是参数还是“DATA_TABLE”表中的列?问题中添加了表。NumberPattern是表中的列名,CALLNUM是在过程中输入的。在oracle中没有太多exp,但您可以像这样使用行号。从选择a_val,vara_val,varb_val中选择a_val,b_val到vara_val,数据表中的varb_val,其中类CALLNUM NumberPattern | |‘“%”Z通过varb_val order by varb_val desc=1限定分区上的行数@anwaar_地狱:我希望最大匹配模式应该返回。示例03354123类似于03354%,而03354123类似于033%。因为03354%与03354123的匹配比033%多。是的。在这种情况下,它将返回所有。但如果数据包含03354103303,则它必须仅与1个ie 033541MAX模式匹配。你能帮忙吗?答案在我的答复中。按降序排序并选择第一个结果。另请参见Turophile的回答。按价格r排序的订单上的行数是多少?我不明白。按价格订购?你是说按数字订购吗=当最大长度出现平局时,RANK将返回多行。OP没有说明他们希望在这种情况下发生什么。@APC:当有最长的领带时,我将不得不检查我的商业案例。@Vance:您提供的查询目前正在为我工作。给我最好的理由。你能给我解释一下这个问题吗?但是,尽管排名的最大长度是相同的,但模式会有所不同。例如,图案12345和12344具有相同的长度,但彼此不同。假设他的表中的模式是唯一的,我相信这个查询会做得很好,先生@APCI看到了你关于排名的其他帖子,所以这里有一些额外的信息:行:rank overorder by length NumberPattern desc将rank NumberPattern by it's length按降序排列,这样长度最大的模式将始终位于排名1。rank在我的提问中也帮了我很多忙