使用PLSQL CASE语句

时间:2016-01-14 15:36:54

标签: sql oracle plsql case

我正在尝试使用case语句来确定应该执行哪个select语句。
我想检查变量:SSN的第三个字符。如果第三个字符是破折号,请使用第一个SQL语句来掩盖前5个数字(XX-XXX1234)。否则,使用第二个SQL语句来掩盖前5个数字(XXX-XX-1234)。

这个的正确语法是什么?

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

3 个答案:

答案 0 :(得分:1)

您可以将<{1}} 表达式用于此

CASE

答案 1 :(得分:0)

  

只是替代尝试。享受

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

答案 2 :(得分:0)

在PL / SQL中无用的SQL上下文(即select from dual)是一种非常糟糕的做法。在这里,我们有一个完全有效且简单的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

(请注意,我说无用使用 - 有许多有效的使用场景,但这不是其中之一。)