如何在街道地址中精准匹配州缩写,避免INSTR函数误匹配?
解决SQL中街道地址州缩写误匹配的问题
你当前用INSTR的问题在于,它只是简单匹配子字符串,不管这个子字符串是不是作为独立的州缩写出现——比如TestingAve里的gA刚好和GA重合,就会被误判。要只匹配真正作为独立词存在的州缩写,得用正则表达式来限定匹配的边界。
下面分几种常见SQL数据库给出解决方案:
MySQL/MariaDB
用REGEXP结合单词边界标记[[:<:]](词首)和[[:>:]](词尾),确保州缩写是单独的词:
SELECT * FROM Cleanup WHERE Street REGEXP CONCAT('[[:<:]]', State, '[[:>:]]');
如果需要忽略大小写(比如街道里写的是ca而State存的是CA),可以加上不区分大小写的排序规则:
SELECT * FROM Cleanup WHERE Street REGEXP CONCAT('[[:<:]]', State, '[[:>:]]') COLLATE utf8mb4_general_ci;
PostgreSQL
用~*(不区分大小写正则匹配)和单词边界\m(词首)、\M(词尾):
SELECT * FROM Cleanup WHERE Street ~* CONCAT('\m', State, '\M');
SQL Server
用PATINDEX结合单词边界[[:<:]]和[[:>:]]:
SELECT * FROM Cleanup WHERE PATINDEX('%[[:<:]]' + State + '[[:>:]]%', Street) > 0;
额外适配场景
如果街道地址里的州缩写后面可能跟逗号、句号等标点(比如223 Nevada Dr CA,),可以调整正则,匹配前后是非字母字符或者字符串首尾,避免漏匹配:
以MySQL为例:
SELECT * FROM Cleanup WHERE Street REGEXP CONCAT('(^|[^a-zA-Z])', State, '([^a-zA-Z]|$)');
内容的提问来源于stack exchange,提问作者Rkraynick
相关产品推荐
相关产品推荐

