如何用SQL筛选包含另一表中任意城市字符串的行?
解决SQL包含匹配城市名的问题
原语句使用IN进行完全匹配,无法满足包含城市名的筛选需求,以下是两种可行的解决方案:
方案一:使用EXISTS子查询
这种方式会检查每条QUERY记录是否包含zipcodes表中任意一个城市名,逻辑清晰且性能较好:
SELECT q.QUERY, f.ANONID FROM FACTS f INNER JOIN QUERYDIM q ON f.QUERYID = q.ID WHERE EXISTS ( SELECT 1 FROM zipcodes z WHERE q.QUERY LIKE CONCAT('%', z.city, '%') );
CONCAT('%', z.city, '%')生成包含城市名的模糊匹配规则,%代表任意长度的字符(包括空字符)EXISTS只要找到一个匹配的城市名就会停止当前行的子查询,效率较高
方案二:使用JOIN结合模糊匹配
通过JOIN关联两个表,直接筛选出包含城市名的记录,注意需要加DISTINCT避免重复结果:
SELECT DISTINCT q.QUERY, f.ANONID FROM FACTS f INNER JOIN QUERYDIM q ON f.QUERYID = q.ID INNER JOIN zipcodes z ON q.QUERY LIKE CONCAT('%', z.city, '%');
DISTINCT用于去重:如果一条QUERY包含多个城市名,会生成多条重复记录,去重后保留唯一行
注意事项
如果你的数据库区分字符大小写(比如默认配置的PostgreSQL、MySQL在区分大小写的字符集下),可以统一转换为小写(或大写)来避免漏匹配:
-- 方案一的大小写兼容版 SELECT q.QUERY, f.ANONID FROM FACTS f INNER JOIN QUERYDIM q ON f.QUERYID = q.ID WHERE EXISTS ( SELECT 1 FROM zipcodes z WHERE LOWER(q.QUERY) LIKE CONCAT('%', LOWER(z.city), '%') );
内容的提问来源于stack exchange,提问作者Shahin
相关产品推荐
相关产品推荐

