Oracle SQL如何查询含数字的城市记录并排除Praha相关结果
问题说明
现有存储地址信息的数据库表,部分CITY字段值附带代表行政区编号的数字后缀,表结构及示例数据如下:
| ID | CITY | COUNTRY |
|---|---|---|
| 1 | Praha 4 | CZE |
| 2 | Dublin 1 | GBR |
| 3 | Budapest 3 | HUN |
| 4 | Dublin | GBR |
| 5 | Praha 7 | CZE |
| 6 | Budapest | HUN |
需求为提取CITY字段包含数字的所有记录,同时过滤掉CITY值包含Praha的条目。此前尝试搭配LIKE、NOT LIKE、!=运算符、子查询排除Praha记录、甚至直接过滤COUNTRY='CZE'的方案,均无法生效,始终返回全部带数字的记录,未排除Praha相关数据。
写法失效核心原因
这类筛选失效90%以上是逻辑运算符优先级问题:SQL中AND的运算优先级高于OR,如果写多个LIKE '%数字%'的匹配条件时没有给所有OR连接的数字判断条件加括号,NOT LIKE '%Praha%'的条件只会和最后一个数字判断条件做AND运算,前面的数字匹配条件只要命中就会返回结果,自然无法过滤Praha的记录。
可直接运行的Oracle SQL
简洁正则写法(推荐)
用Oracle自带的正则函数可以避免多条件OR的优先级坑,逻辑清晰不易写错:
SELECT ID, CITY, COUNTRY FROM 替换为你的实际表名 WHERE -- 匹配CITY字段中包含任意0-9数字的记录 REGEXP_LIKE(CITY, '[0-9]') -- 排除CITY包含Praha的记录,末尾'i'参数代表不区分大小写匹配,不需要可以删掉 AND NOT REGEXP_LIKE(CITY, 'Praha', 'i');
基础语法写法(不依赖正则)
如果不想用正则函数,一定要给所有数字判断的OR条件整体加括号,强制逻辑判断顺序:
SELECT ID, CITY, COUNTRY FROM 替换为你的实际表名 WHERE -- 所有数字判断条件必须放在括号内作为一个整体逻辑块 ( CITY LIKE '%0%' OR CITY LIKE '%1%' OR CITY LIKE '%2%' OR CITY LIKE '%3%' OR CITY LIKE '%4%' OR CITY LIKE '%5%' OR CITY LIKE '%6%' OR CITY LIKE '%7%' OR CITY LIKE '%8%' OR CITY LIKE '%9%' ) AND CITY NOT LIKE '%Praha%';
结果验证
针对给出的示例数据,上述SQL执行后仅返回2条符合要求的记录,完全匹配需求:
| ID | CITY | COUNTRY |
|---|---|---|
| 2 | Dublin 1 | GBR |
| 3 | Budapest 3 | HUN |
内容的提问来源于stack exchange,提问作者Acaberya
相关产品推荐
相关产品推荐

