如何查询数据库表中匹配含带/无句点缩写的目标城市名?
嘿,这个场景太常见了!我之前处理地址类数据的时候也踩过类似的坑,给你分享几个实用的解决办法:
方法1:字符串替换消除句点差异
最简单直接的方式就是把数据库里城市名称中的句点去掉,再和你手里的不带句点的字符串做精确匹配。不同数据库的替换函数略有不同,给你举几个常用的例子:
MySQL / MariaDB
SELECT * FROM your_table WHERE REPLACE(city_column, '.', '') = 'Ft Worth';
PostgreSQL
SELECT * FROM your_table WHERE REPLACE(city_column, '.', '') = 'Ft Worth'; -- 或者用正则替换也可以:REGEXP_REPLACE(city_column, '\.', '', 'g')
SQL Server
SELECT * FROM your_table WHERE REPLACE(city_column, '.', '') = 'Ft Worth';
这个逻辑很直白:把表中城市列的所有句点都清空,再和Ft Worth对比,不管原数据是Ft. Worth还是Ft Worth都会被匹配到。如果担心大小写问题(比如ft worth、Ft. WORTH),可以统一转成小写或大写:
SELECT * FROM your_table WHERE LOWER(REPLACE(city_column, '.', '')) = LOWER('Ft Worth');
方法2:正则表达式匹配(适合复杂缩写场景)
如果你的数据里还有其他类似的缩写(比如St. Louis/St Louis、Dr. Phillips/Dr Phillips),用正则表达式可以更灵活地匹配带或不带句点的情况:
MySQL / MariaDB
SELECT * FROM your_table WHERE city_column REGEXP '^Ft\.? Worth$';
这里的\.?表示句点是可选的,^和$确保整个字符串完全匹配,避免误匹配到Ft. Worthy这类无关城市。
PostgreSQL
SELECT * FROM your_table WHERE city_column ~ '^Ft\.? Worth$';
方法3:提前标准化数据(一劳永逸)
如果这类不规范的数据经常给你添堵,不如一次性把数据统一格式,以后查询就省心多了:
-- 先备份表!先备份表!先备份表!重要的事说三遍 UPDATE your_table SET city_column = REPLACE(city_column, '.', '');
执行完这个更新后,所有城市名称里的句点都会被移除,之后直接用精确匹配查询就行,效率也比每次查询都做替换高很多。
内容的提问来源于stack exchange,提问作者santa
相关产品推荐
相关产品推荐

