db2 translate函数
以下内容参考自文档:
translate 函数
官方示例:
示例1:
fn:translate('Test literal','el','om')
-- RETURN RESULT: Tost mitoram
上述式子的意思为:
对于字符串:‘Test literal’,使用o 替代 e,使用 m替代 l
示例2:
fn:translate('Another test literal', 'Ater', 'Bfim')
函数返回在字符串文字“Another test literal”中进行以下替换后生成的字符串:A 替换为 B,t 替换为 f,e 替换为 i 并且 r 替换为 m。
当要替换的字符串 以及 用来替换的字符串不等长的时候,会自动忽略:
示例3:
SELECT TRANSLATE('123405060708 9ASGHKBJNJ4562113','*+',
' 0123456789') FROM SYSIBM.DUAL
函数将用*替代空格,使用+替代0,对前面的字符串进行替换,而对于其他的数字(123456789)则也会使用空格进行替换,
因此替换后的结果为:
' + + + + ** ASGHKBJNJ '
示例4:
SELECT TRANSLATE('123456579SGIAIJNJKNJIN','*-+#$%^&*','3235') FROM SYSIBM.DUAL
当用来替换的字符串长于要被替换的字符串,并且存在一对多的情况时,按照顺序进行匹配。
上式:
使用*替换数字3,使用-替换数字2,使用#替换数字5
结果:
'1-*4#6#79SGIAIJNJKNJIN'
一般TRANSLATE可以与TRIM()/LENGTH()函数联用,也可以隐藏一些信息,可以检查字符串是否含有某个字符(类似于正则的功能)
比如对手机号进行隐藏处置:
SELECT TARNSLATE('15923456789','*********','023456789') from SYSOBM.DUAL
RESULT RETURNED: '1**********'
结合TRIM()/LENGTH()函数使用:
SELECT LENGTH(TRIM(TRANSLATE(FIELD,'*',' 0123456789'))) FROM TABLE_NAME
如果是数字的话,那么会被替换掉,如果存在空格的话,会变成*,用上述语句判断,该字段是否全部由数字组成,如果是的话,那么表达式应当为0
GBASE regexp_replace函数
在GBASE中能够实现类似功能的函数有regexp_replace
文章参考:
GBase 8a 模糊查询和正则函数regexp_replace、regexp_like
示例1:
select regexp_replace('First','st','AB');
-- RESULT RETURNED: 'FirAB'
除了智齿字符串替换之外,regexp_replace还支持正则替换。
示例2:
select regexp_replace('我的电话13812345678。','13[6-9][0-9]{8}','***********');
-- RESULT RETURNED:我的电话***********。
上述式子也可以写作:
select regexp_replace('我的电话13812345678。','[0-9]','*');
-- RESULT RETURNED:我的电话***********。
因为’[0-9]'已经可以匹配所有的数字了。
SELECT LENGTH(TRIM(TRANSLATE(FIELD,'*',' 0123456789'))) FROM TABLE_NAME
使用 regexp_replace改写为:
我们希望将所有的数字都替换为空,再去除空格,看看最后的式子的长度是不是等于0,如果等于0的话,我们可以判断,整个式子都是由数字构成的
SELECT LENGTH(TRIM(regexp_replace(FIELD,'[0-9]',' '))) FROM TABLE_NAME
其他用法:
指定起始位置匹配、指定匹配出现的序数、额外参数忽略大小写参考regexp_replace()。
PS:
函数语法:
regexp_replace(source_char,pattern[,replace_string[,position[,occurren
ce[match_option]]]])
说明:
- 用 replace_string 指定的字符串替换源字符串中与 pattern 指定的正则表达式相匹配的字符串。
- source_char 源字符串。该参数支持的数据类型与 8a 的 replace 函数的 src 参数一致。
- pattern 正则表达式。每个正则表达式最多可包含 512 个字节。具体语法规则请参考 PCRE-7.8 版本的语法规则说明
- replace_string 替换字符串。替换字符串可以包含反向引用的数字表达式(\n,n 的取值范围是[1,9])
- position 开始匹配的位置,如果不指定默认为 1,即从 source_char 的第一个字符开始匹配。position
为一个正整数。 - occurrence 正则匹配的序数。是一个非负的整数,默认值为 0。 指定为 0,则替换所有匹配到的字符串; 如果指定为整数
n,则替换第 n 次匹配到的字符串; - match_parameter 可通过设置该参数改变默认的匹配功能行为。默认情况下“.”不匹配换行符,源字符串被看作一行。参数可选项如下:
i:大小写不敏感;
c:大小写敏感;
n:点号(.)不匹配换行符号;
m:多行模式;
x:扩展模式,忽略正则表达式中的空白字符。 - 用户同时指定多个互斥参数可选项时,系统按照最后一个参数处理。用户指定 match_parameter
参数选项(i,c,n,m,x)以外的选项时,系统报错。 - regexp_replace 函数的
replace_string、position、occurrence、match_parameter参数都能省略,若上述 4
个参数中的任何一个省略,省略参数后的所有参数都不能设置,若需要设置后续参数则必须给出所设置参数的上一个参数的值。 - 由于 sql 语法与 pcre 正则语法都使用反斜杠(‘’)作为转义符。所以在
pattern中应使用连续两个反斜杠(‘')作为正则的转义符。 regexp_replace 函数不支持递归。 - 如果 source_char 参数为运算结果而非表的实体列,且此运算结果大于 512个字节,则函数报错。
- 当前版本不支持group捕获后的替换。