我正在尝试使用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
答案 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
(请注意,我说无用使用 - 有许多有效的使用场景,但这不是其中之一。)