如何使用regexp_replace使用select语句替换字符串中的字符?

时间:2015-06-25 04:35:59

标签: sql oracle regexp-replace

以下是我的代码

select (upper(fname)||' '||upper(mname)||' '||upper(lname)) as customer_name,
(indv_corp_flag) as Customer_type,
(regexp_replace(passport_no,'D','B')"regexp_replace") as passport_no, 
(case when indv_corp_flag = 'C' then registration_no else null end) as registration_no,
(case when indv_corp_flag = 'I' then marital_status else null end) as Marital_status
from Nbfc_krishnan_m;

它给出了错误,如

ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:
Error at Line: 91 Column: 38

但是在单独操作时,它就像

一样
select
regexp_replace(passport_no,'S','d')"regexp_replace" 
from nbfc_krishnan_m; 

成功执行。

1 个答案:

答案 0 :(得分:2)

您已将投影的所有列包装在不必要的括号中。它会编译,但杂乱无法阻止您看到问题。没有这些括号,很明显你有一个包含两个别名的列:

regexp_replace(passport_no,'D','B')"regexp_replace" as passport_no

您发布了一个有效的查询。它的工作原理是因为它只有一个别名。因此解决方案很明显:

select upper(fname)||' '||upper(mname)||' '||upper(lname) as customer_name,
        indv_corp_flag as Customer_type,
        regexp_replace(passport_no,'D','B') as passport_no, 
        case when indv_corp_flag = 'C' then registration_no else null end as registration_no,
        case when indv_corp_flag = 'I' then marital_status else null end as Marital_status
from Nbfc_krishnan_m;

在将来的实际需要它们的表达式的保留括号中。

  

"如果字符串是DCCFF12996,我希望输出为BCCFF12669"

您只是将一个字符替换为另一个字符,因此您应该使用标准TRANSLATE()函数。只在需要正则表达式(即模式)时才使用REGEXP_REPLACE()。

SQL> select upper(fname||' '||mname||' '||lname) as customer_name,
  2     passport_no, 
  3     translate(passport_no,'D69','B96') as new_passport_no 
  4  from Nbfc_krishnan_m; 

CUSTOMER_NAME                     PASSPORT_N NEW_PASSPO
--------------------------------- ---------- ----------
FOX IN SOCKS                      ABCD123    ABCB123
DAISY HEAD MAYZIE                 DCCFF12996 BCCFF12669

SQL>