我正在编写一个简单的PL / SQL来格式化员工CUIL(社会安全ID)问题是我想替换一个或多个' - '或'/'或空格来换一个简单的' - '并且我的代码可以工作对于空格和'/'很好,但我对另一个没有幸运。你能帮助我吗?感谢
CREATE OR REPLACE FUNCTION formatear_cuit_cuil(p_cuit_cuil VARCHAR2)
RETURN VARCHAR2
IS
v_length VARCHAR2(50) := p_cuit_cuil;
BEGIN
IF
LENGTH(REGEXP_REPLACE(v_length, '[/ | |.]+')) <> 11 THEN
RETURN 'El CUIT/CUIL no tiene el largo correcto';
END IF;
IF
REGEXP_LIKE(
p_cuit_cuil,
'^[0-9][0-9][ /-]+[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][ /-]+[0-9]$'
) THEN
RETURN REGEXP_REPLACE(p_cuit_cuil, '/+| +', '-');
ELSE
RETURN 'CUIT/CUIL no tiene el formato correcto';
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN 'Error al formatear CUIT/CUIL';
END formatear_cuit_cuil;
有效的示例
不起作用的示例
答案 0 :(得分:0)
这将帮助您入门:
with a as (
select '98 46134679////1' as before from dual
union all
select '98 ////// 46134679 1' as before from dual
)
select a.before,
regexp_replace(a.before,
'^([0-9][0-9])([ /-])+([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])([ /-]+)([0-9])$',
'\1-\3-\5') as formatted from a;
产生这个:
BEFORE FORMATTED
98 46134679//// 1 98-46134679-1
98 ////// 46134679 1 98-46134679-1
我基本上在部分数据周围使用括号组,并选择括号1中匹配的信息,后跟破折号,括号3中匹配的信息,后跟破折号,然后是括号5中匹配的信息。您可以先执行该功能,然后检查结果的长度等。
答案 1 :(得分:0)
这应该用作regexp_replace - '([ /-]+)', '-'
e.g。
select regexp_replace('/// 98 ////// 46134679 1', '([ /-]+)', '-')
from dual
返回-98-46134679-1
匹配一个或多个指定字符,并将其替换为单个-