Oracle SQL:基于街道号/街道名对构建带模糊匹配的WHERE子句
多组地址对的模糊查询解决方案
你需要匹配指定街道号与对应模糊街道名的组合,原写法的逻辑错误在于让所有街道号和街道名条件自由组合,而非一一对应。正确写法是将每组地址对的条件用OR连接,每个分支内对应一组街道号和模糊街道名的匹配:
SELECT * FROM TABLE WHERE (STREET_NUMBER = '123' AND STREET_NAME LIKE '%MAIN%') OR (STREET_NUMBER = '231' AND STREET_NAME LIKE '%ELM%') OR (STREET_NUMBER = '5245' AND STREET_NAME LIKE '%BROAD%') OR (STREET_NUMBER = '73334' AND STREET_NAME LIKE '%THIRD%')
原写法失效原因
原写法STREET_NUMBER IN (...) AND STREET_NAME LIKE (...)的逻辑是:只要街道号在列表中且街道名匹配任意模糊条件就会被选中,这会导致错误匹配(比如街道号123搭配含ELM的街道名),不符合你需要的一一对应地址对的需求。
街道名变体处理
针对Road/Rd、Avenue/Ave这类不规范变体:
- 直接用
%关键词%的模糊匹配即可覆盖大部分情况,比如%MAIN%会匹配Main St、Main Rd、Main Avenue等 - 若需更精准,可扩展单个分支的条件,比如
STREET_NAME LIKE '%MAIN%' OR STREET_NAME LIKE '%MN%'
由于是临时查询,该写法无需考虑性能问题,完全满足需求。
内容的提问来源于stack exchange,提问作者KevinR
相关产品推荐
相关产品推荐

