在查询SQL Postgresql中替换A-Z和0-9

时间:2018-09-18 14:15:39

标签: sql postgresql replace

我目前有一个字符串,例如E-1082067D,我想为每一行查询出这些字符串的简化版本。返回L(代表字母代替A-Z),S(代表符号)和N(代表数字0-9)。我没有权限,只是想查询数据,所以无法更新数据库或创建新表。

到目前为止,我已经将字符串拆分为单个字符,现在想替换拆分的字符并将它们重新连接在一起,以得到最终结果,例如代替E-1082067D将是LSDDDDDDDL

任何有关如何清理以下内容或如果我以错误的方式进行此操作的反馈,将不胜感激。

s

elect site_name,natid, x, COUNT (x), substring(natid,1,1)as a,
substring(natid,2,1)as b,
substring(natid,3,1)as c,
substring(natid,4,1)as d,
substring(natid,5,1)as e,
substring(natid,6,1)as f,
substring(natid,7,1)as g,
substring(natid,8,1)as h,
substring(natid,9,1)as i,
substring(natid,10,1)as j,
substring(natid,11,1)as k,
substring(natid,12,1)as l,
substring(natid,13,1)as m 
from (
select site_name, subject_id, natid,natidchk, length(natid)as x
from demog 
order by x) as y
group by natid, site_name,  x
order by site_name, x;

1 个答案:

答案 0 :(得分:3)

这可以通过使用多个正则表达式来实现:

with data (natid) as (
   values 
      ('E-1082067D'), 
      ('X&42FOO567$BAR')
)
select natid, 
       regexp_replace(regexp_replace(regexp_replace(natid, '([A-Z])', 'L', 'ig'), '[0-9]', 'N', 'ig'), '[-&$]', 'S', 'ig')
from data;       

首先将所有出现的A-Z替换为L,然后将所有出现的0-9替换为N-&$替换为S

以上返回:

natid          | regexp_replace
---------------+---------------
E-1082067D     | LSNNNNNNNL    
X&42FOO567$BAR | LSNNLLLNNNSLLL