You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:42:07