MySQL不使用OR如何查询匹配多个指定字段值的表记录
原查询失效原因
- 字段名书写错误:语句中写的是带空格的
property type,实际表中字段名为PROPERTY_TYPE - 匹配逻辑错误:
LIKE '%Residential,office%'的匹配规则是查找字段值中连续包含Residential,office(带逗号拼接)的记录,但你的字段是单值存储,单条记录只会存Residential、Commercial、office其中一个独立值,不可能出现逗号拼接的目标字符串,因此无返回结果。
你之前尝试FIND_IN_SET等方案无效,是因为这类函数是专门用于匹配「字段本身存储逗号分隔多值」的场景,和你当前单值存储的表结构不匹配。
无OR的可行实现方案
方案1:IN运算符(优先推荐,全数据库通用)
IN运算符本身就是为单字段多值精确匹配设计的,不需要写多个OR条件,新增筛选值只需要在括号内追加即可,还能正常命中字段索引,查询性能最优:
SELECT * FROM property_types WHERE property_type IN ('Residential', 'office'); -- 注意括号内的值大小写需要和库内实际存储的大小写保持一致,大小写不敏感的数据库可忽略该要求
如果后续需要新增匹配的属性类型,直接在IN的列表里追加对应字符串即可,比如要加Industrial就改成IN ('Residential', 'office', 'Industrial'),逻辑简洁不会出现大量OR堆叠的问题。
方案2:CTE/临时表关联(适合大量筛选值、复杂查询场景)
如果需要匹配的属性类型数量多,甚至筛选值是从其他业务逻辑计算、关联其他表得到的,可以用CTE或者临时表存目标类型值,再做关联查询,示例(支持CTE的主流数据库通用):
WITH target_property_types (type_val) AS ( VALUES 'Residential', 'office' -- 可在此处追加任意多目标值,也可以替换为子查询从其他关联表拉取符合要求的类型值 ) SELECT p.* FROM property_types p INNER JOIN target_property_types t ON p.property_type = t.type_val;
注意:不要用LIKE做这类枚举值的精确匹配,一是无法命中索引性能差,二是容易出现误匹配——比如存在
ResidentialPlot这类值时,LIKE '%Residential%'会把不符合要求的记录也查出来。
内容的提问来源于stack exchange,提问作者Kayani
相关产品推荐
相关产品推荐

