一.需求描述
今天朋友遇到一个问题,数据库中的某一列中字母开头后面跟随14个数字的字符串,例如 'a12345678912345' 这种。
其实各个编程语言例如Java、Python等都有自己的正则,朋友不想那么麻烦,想在数据库里面来实现。
二.解决方案
2.1 Oracle的解决方案
Oracle的正则表达式虽然没有Java、Python的那么强大,但是也足够够用。
^ 匹配每一行的开头,单行模式下等价于字符串的开头
$ 匹配每一行的结尾,单行模式下等价于字符串的结尾
字母可以使用 [a-zA-Z]
数字可以用 \d 或者 [0-9]
因为存在两个匹配的规则,所以需要使用到组合
(…) 圆括号,将复杂表达式当作单一表达式来处理
代码:
SELECT *
from
(
select 'a12345678912345' as str1 from dual
union ALL
select '12345678912345' as str1 from dual
union ALL
select 'a12345678912345abc' as str1 from dual
union ALL
select 'a1234567891234' as str1 from dual
union ALL
select 'ab12345678912345' as str1 from dual
) tmp1
where regexp_like(str1,'(^[a-zA-Z])(\d{14}$)')
测试记录:
SQL> SELECT *
2 from
3 (
4 select 'a12345678912345' as str1 from dual
5 union ALL
6 select '12345678912345' as str1 from dual
7 union ALL
8 select 'a12345678912345abc' as str1 from dual
9 union ALL
10 select 'a1234567891234' as str1 from dual
11 union ALL
12 select 'ab12345678912345' as str1 from dual
13 ) tmp1
14 where regexp_like(str1,'(^[a-zA-Z])(\d{14}$)')
15 /
STR1
------------------
a12345678912345
2.2 MySQL 解决方案
MySQL的正则比Oracle弱一些,但是也足够了对付一些日常需求了。
^ 匹配每一行的开头,单行模式下等价于字符串的开头
$ 匹配每一行的结尾,单行模式下等价于字符串的结尾
字母可以使用 [a-zA-Z]
数字可以用 [0-9]
Oracle的 \d MySQL 无法识别
目前mysql也不支持类Oracle的组合操作符,只能分开写。
代码:
SELECT *
from
(
select 'a12345678912345' as str1
union ALL
select '12345678912345' as str1
union ALL
select 'a12345678912345abc' as str1
union ALL
select 'a1234567891234' as str1
) tmp1
where str1 regexp '^[a-zA-Z]'
and str1 regexp '[0-9]{14}$'
测试记录:
mysql> SELECT *
-> from
-> (
-> select 'a12345678912345' as str1
-> union ALL
-> select '12345678912345' as str1
-> union ALL
-> select 'a12345678912345abc' as str1
-> union ALL
-> select 'a1234567891234' as str1
-> ) tmp1
-> where str1 regexp '^[a-zA-Z]'
-> and str1 regexp '[0-9]{14}$'
-> ;
+-----------------+
| str1 |
+-----------------+
| a12345678912345 |
+-----------------+
1 row in set (0.00 sec)
mysql>