从Varchar

时间:2018-07-23 09:17:11

标签: sql oracle plsql

在pl sql中,我有 VAR_NUMBER VARCHAR2(30)的值为1122987654.这是前缀+数字,因此1122是前缀,而987654是数字。

我还有另一个前缀表 PREFIX_TABLE,值是

ID->PREFIX
1 -> 1122
2 -> 2233 

所以我需要从1122987654删除与上表匹配的前缀。在上表中,我们有1122,所以我需要从1122987654中删除1122。

有人可以帮忙吗?如何在pl sql中执行此操作。

4 个答案:

答案 0 :(得分:1)

可能有一个声明式解决方案,但我认为在这种情况下,迭代方法可能更具可读性。

CordaformDefinition

应该这样做

答案 1 :(得分:0)

您可以使用REGEXP_REPLACE

这假定只有单个值匹配,否则使用MAX,MIN或将其放入for循环中。

DECLARE 
    var_number   VARCHAR2(30) := 1122987654; 
    v_prefix_rem VARCHAR2(30);
BEGIN 
    SELECT MIN(regexp_replace (var_number, '^' 
                                       ||prefix)) 
    INTO   v_prefix_rem 
    FROM   prefix_table 
    WHERE  var_number LIKE prefix 
                           ||'%'; 
END; 

/ 

编辑

  

可以匹配多个条目,但需要考虑最长匹配。

您可以为此使用MIN,因为最长匹配项的后缀为最短

 select MIN(REGEXP_REPLACE ( VAR_NUMBER, '^'||PREFIX)) INTO VAR_NUMBER 
    FROM 
  PREFIX_TABLE WHERE VAR_NUMBER LIKE  prefix||'%';

Demo

答案 2 :(得分:0)

尝试一下 通常从7、8和9开始移动

声明@string varchar(20) 设置@string ='215459924456544'

选择子字符串(@ string,patindex('%[7-9]%',@ string),10)

答案 3 :(得分:0)

下面的PL / SQL块应该可以满足您的需求:

declare
  cursor mycursor is
    select substr(var_number, length(prefix))
      from varnum, prefix_table
     where var_number like prefix || '%'
     order by length(prefix) desc;

  result  varchar2(30);
begin
  open  mycursor;
  fetch mycursor into result;
  close mycursor
  dbms_output.put_line('Result = ' || result);
end;

请注意,我没有将它作为游标进行测试,但是我确实对查询进行了测试。