sql - 存储过程最大模式匹配

标签 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_val
     FROM data_table
    WHERE callnum LIKE numberpattern || '%';
 END;

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

  1. 03354123 喜欢 033%

  2. 03354123 像 03354%

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

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

表:

表名称:DATA_TABLE

列:

NumberPattern (varchar2) : 033, 03354

a_val ( integer ) : 1, 2

b_val ( integer ) : 1, 2

最佳答案

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

  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 参数,它只会对模式 12345 和 1234 进行排名,因为您的 CALLNUM 以 12345 和 1234 开头,而不是以 789 开头。排名后,我选择了来自排名为 1 的子查询的 NumberPattern、a_val 和 b_val

关于sql - 存储过程最大模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33251452/

相关文章:

sql - 使用交叉表将行转换为列失败

eclipse - 由于错误,无法从 Web 服务生成 WSDL

sql - 在 Oracle 中,查询换行出现的 SQL 是什么?

MYSQL存储过程select语句select不正确的ID

java - 如何正确地将参数值传递给sql查询? java、netbeans

mysql - 如何在 SQL 的 3 个特定列中输入 3 个词并搜索这些词?

java - 从 Java 类 (ocijdbc11.dll) 连接到 Oracle 数据库时出现问题

sql - SQL Server存储过程为总数添加两个声明的值

java - MapSqlParameterSource 无法与存储过程的 NamedParameterJdbcTemplate 正确映射

sql - 通过 SSH 将 SQL DB 备份到 Mac 桌面