目录
备份表时候,oracle11g的表名最长是30个字符,所以当备份的时候,加上前缀bak_0712这种就不行了,如果需要备份的表比较多的时候,挨个重
命名很麻烦,(命名本身就是一个很让人头疼的事情),所以我直接采用首字母的方式
例如原表名为 'TD_RESOURCE_MODIFY_RECORD'
那么备份表为:BAK_0712_TD_RESOURCE_MODIFY_RECORD 这个太长了,重命名成:BAK_0712_T_R_M_R
关键在于正则表达式怎么写:
select regexp_replace('BAK_0712_TD_RESOURCE_MODIFY_RECORD','_([[:alpha:]])[[:alpha:]]+','_\1',8) from dual
分析:
regexp_replace函数各参数意义见https://blog.csdn.net/gxftry1st/article/details/22489275 ,
语法 | 说明 |
REGEXP_REPLACE(source_string, pattern | 该函数用一个指定的 replace_string 来替换匹配的模式,从而允许复杂的"搜索并替换"操作。 |
第一个是参数是原字符串
第二个是pattern
第三个是替换的字符
第四个是从哪个位置开始
第五个是第几次匹配的时候替换
第六个不清楚,没用到
分析我构造的正则:
'_([[:alpha:]])[[:alpha:]]+'
这边是找到_字符,后面跟着一个字母,然后再跟着若干个字母,其中第一个字母是\1,(正则中圆括号用于分组,按顺序分别是第一组,第二组..)
要替换的就是只留下_加上第一组(即首字母),
开始的位置我定的是从第8个字符开始匹配,没有第五个参数,即后面的都替换
就可以达到效果,如果只想替换单个的,比如第二次匹配的及,可以用
select regexp_replace('BAK_0712_TD_RESOURCE_MODIFY_RECORD','_([[:alpha:]])[[:alpha:]]+','_\1',8,2) from dual
这样就是只替换resource了,结果为:
BAK_0712_TD_R_MODIFY_RECORD
条件查询
SELECT a.bloc_code
FROM tbl_xxx a
WHERE a.bloc_code IS NOT NULL
AND substr(a.bloc_code, 2, 6) = #{dimArea
,jdbcType = VARCHAR}
AND regexp_like(a.bloc_code, '^Y[[:digit:]]{6}[[:digit:]]{5}$')
UNION
SELECT b.sales_code bloc_code
FROM tbl_xxx2 b
WHERE b.sales_code IS NOT NULL
AND substr(b.sales_code, 2, 6) = #{dimArea
,jdbcType = VARCHAR}
AND regexp_like(b.sales_code, '^Y[[:digit:]]{6}[[:digit:]]{5}$')
ORDER BY bloc_code
这种比较简单,找到以Y开头+6位数字+5位数字的数据