2016-01-14 135 views
0

我想使用case語句來確定應該執行哪個select語句。
我想檢查變量:SSN的第三個字符。如果第三個字符是短劃線,則使用第一個SQL語句來掩蓋前5個數字(XX-XXX1234)。否則,使用第二條SQL語句來掩蓋前5個數字(XXX-XX-1234)。使用PLSQL CASE語句

這是什麼正確的語法?

select case 
    when substr(:SSN, 3,1) = '-' then 
    SELECT 'XX-XXX'||substr(:SSN, 7,4) INTO :MaskedSSN FROM DUAL 
else 
    SELECT 'XXX-XX-'||substr(:SSN, 8,4) INTO :MaskedSSN FROM DUAL 
end 
+1

如果您在PL/SQL中而不僅僅是在SQL查詢中,爲什麼不使用簡單的IF? –

回答

1

您可以使用SQL CASE表達這個

select case 
    when substr(:SSN, 3,1) = '-' then 
    'XX-XXX'||substr(:SSN, 7,4) 
else 
    'XXX-XX-'||substr(:SSN, 8,4) 
end 
INTO :MaskedSSN 
from dual 
+0

謝謝。這是使用的代碼: select case 當substr(:SSN,3,1)=' - 'then 'XX-XXX'|| substr(:SSN,7,4) else 'XXX-XX- '|| substr(:SSN,8,4) end INTO:MaskedSSN from – user3352171

+1

但請記住,@AndreaBergia提供了很好的建議。在pl \ sql中爲此任務使用SQL是一個小開銷。 –

0

只是一個alternaive到try.Enjoy

SELECT DECODE(SUBSTR(:SSN, 3,1),'-','XX-XXX' 
    ||SUBSTR(:SSN, 7,4),'XXX-XX-' 
    ||SUBSTR(:SSN, 8,4)) 
INTO lv_var 
FROM dual; 
0

沒用使用SQL上下文(即select from dual )在PL/SQL中是一個很差的練習伊勢。在這裏,我們有一個非常有效和簡單的PL/SQL唯一的解決方案(這是一個PL/SQL問題反正):

declare 
    function mask_ssn(p_ssn in varchar2) return varchar2 is 
    begin 
    -- the OP explicitly asked for case-statement even old boring if-statement 
    -- would do 
    return case 
     when substr(p_ssn, 3, 1) = '-' then 'XX-XXX' || substr(p_ssn, 7, 4) 
     else        'XXX-XX-' || substr(p_ssn, 8, 4) 
    end; 
    end; 
begin 
    dbms_output.put_line('masked: ' || mask_ssn('AB-CDE1234')); 
    dbms_output.put_line('masked: ' || mask_ssn('ABC-CD-1234')); 
end; 
/

輸出:

masked: XX-XXX1234 
masked: XXX-XX-1234 

(請注意,我說的沒用使用 - 有很多有效的使用場景,但這不是其中之一。)