如何在数据库列中匹配特定格式的姓名首字母缩写?
问题与解决方案
现有表格数据如下:
| COL_1 | COL_2 |
|---|---|
| 1 | J. Z. |
| 2 | T. M. Z. |
| 3 | Banana. Jacobs |
| 4 | I. |
| 5 | Busta Rhymes. |
| 6 | Jesus H. Christ |
需求是筛选出COL_2列中完全符合首字母缩写格式的内容,格式包含三种:
- 单个首字母加句号(如
I.) - 两个首字母加句号,中间空格分隔(如
J. Z.) - 三个首字母加句号,中间空格分隔(如
T. M. Z.)
原SQL语句select * from table where COL_2 like '%[A-Z].%'无法精准匹配,因为它会把所有带点的内容都筛出来,比如Banana. Jacobs这类不符合缩写格式的也会被返回。
正确的SQL写法
不同数据库的正则语法略有差异,以下是几种主流数据库的实现:
MySQL/MariaDB
用REGEXP严格匹配整个字符串:
SELECT * FROM your_table WHERE COL_2 REGEXP '^[A-Z]\\.( [A-Z]\\.){0,2}$';
^和$确保整个字符串完全符合格式,没有多余字符[A-Z]\\.匹配单个大写字母加句号(MySQL里反斜杠需要转义)( [A-Z]\\.){0,2}表示可以重复0到2次「空格+大写字母+句号」,刚好覆盖三种目标格式
SQL Server
方法1:用LIKE枚举三种格式
SELECT * FROM your_table WHERE COL_2 LIKE '[A-Z].' OR COL_2 LIKE '[A-Z]. [A-Z].' OR COL_2 LIKE '[A-Z]. [A-Z]. [A-Z].';
方法2:用REGEXP_LIKE(2016及以上版本支持)
SELECT * FROM your_table WHERE REGEXP_LIKE(COL_2, '^[A-Z]\.( [A-Z]\.){0,2}$');
PostgreSQL
用~操作符做正则匹配:
SELECT * FROM your_table WHERE COL_2 ~ '^[A-Z]\.( [A-Z]\.){0,2}$';
执行以上语句后,会精准返回COL_1为1、2、4的记录,完全符合需求。
内容的提问来源于stack exchange,提问作者Isaac A
相关产品推荐
相关产品推荐

