在pl sql中,我有 VAR_NUMBER VARCHAR2(30)的值为1122987654.这是前缀+数字,因此1122是前缀,而987654是数字。
我还有另一个前缀表 PREFIX_TABLE,值是
ID->PREFIX
1 -> 1122
2 -> 2233
所以我需要从1122987654删除与上表匹配的前缀。在上表中,我们有1122,所以我需要从1122987654中删除1122。
有人可以帮忙吗?如何在pl sql中执行此操作。
答案 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||'%';
答案 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;
请注意,我没有将它作为游标进行测试,但是我确实对查询进行了测试。