2017-05-24 107 views
1

我正在編寫一個簡單的PL/SQL來格式化員工CUIL(社會安全ID)問題是我想用一個簡單的' - '代替一個或多個' - '或'/',而且我的代碼工作正常爲空間和'/',但我沒有幸運的另一個。你可以幫我嗎?由於PL/SQL函數中可以使用正則表達式嗎?

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; 

例,工程 Works Fine!

例不起作用 Doesn't work

+0

我不是專家替換它們,但你不希望' - +'如你的'替換'電話的一部分? 'RETURN REGEXP_REPLACE(p_cuit_cuil,'/ + | + | - +',' - ');' – MarcinJuraszek

+0

我無法對您的評論投票。謝謝你的幫助! –

回答

0

這應該作爲一個REGEXP_REPLACE - '([ /-]+)', '-'

select regexp_replace('/// 98 ////// 46134679 1', '([ /-]+)', '-') 
    from dual 

回報-98-46134679-1

這符合指定字符中的一個或多個與一個-

+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中的信息你可以先做到這一點的功能,然後檢查結果的長度等

+0

現場示例:https://livesql.oracle.com/apex/livesql/file/content_E1F70JQKIKYEH3MNIPZPEOM9U.html –

+2

'[0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9]'可以簡化爲[0-9] {8}'。 –

+0

當然;只是想使用與OP相同的語法;我也應該列出快捷方式,這也可以縮短第一部分:'[0-9] [0-9]'可以是'[0-9] {2}' –

相關問題