Oracle中实现精确匹配优先的发票号查询SQL优化
实现发票号查询的优先级匹配(精确匹配优先于包含匹配)
原SQL的问题在于用OR逻辑时,若INPUT1非空但INPUT2为空,LIKE '%INPUT2%'会变成LIKE '%%',匹配所有记录,导致结果不符合预期。要实现INPUT1非空时仅执行精确匹配,INPUT1为空时执行INPUT2的包含匹配,可以通过条件分支控制查询逻辑:
方案一:逻辑条件组合写法
SELECT * FROM YOUR_TABLE -- 替换为实际表名 WHERE -- INPUT1非空时,仅执行精确匹配 (INPUT1 IS NOT NULL AND INPUT1 <> '' AND INV_NUM = INPUT1) -- 仅当INPUT1为空时,才执行INPUT2的包含匹配(同时确保INPUT2非空) OR (INPUT1 IS NULL OR INPUT1 = '') AND INPUT2 IS NOT NULL AND INPUT2 <> '' AND INV_NUM LIKE '%' || INPUT2 || '%';
逻辑说明
- 第一个条件块:只要INPUT1不为空且非空字符串,就只匹配与INPUT1精确相等的发票号,完全忽略INPUT2的条件
- 第二个条件块:只有当INPUT1为空/空字符串时,才会检查INPUT2是否有效(非空),然后执行包含匹配
方案二:CASE表达式写法(可读性更强)
如果偏好分支逻辑更清晰的写法,可以用CASE表达式:
SELECT * FROM YOUR_TABLE -- 替换为实际表名 WHERE CASE -- INPUT1有效时,判断精确匹配 WHEN INPUT1 IS NOT NULL AND INPUT1 <> '' THEN INV_NUM = INPUT1 -- INPUT1无效但INPUT2有效时,判断包含匹配 WHEN INPUT2 IS NOT NULL AND INPUT2 <> '' THEN INV_NUM LIKE '%' || INPUT2 || '%' -- 两个输入都无效时,返回FALSE(不返回任何记录,可按需改为TRUE返回所有) ELSE FALSE END;
示例验证
- 示例1:INPUT1='123',INPUT2=''
第一个条件触发,仅返回INV_NUM='123'的记录,符合预期 - 示例2:INPUT1='',INPUT2='4'
第二个条件触发,仅返回INV_NUM包含'4'的记录(如'1234'),符合预期
内容的提问来源于stack exchange,提问作者David 54321
相关产品推荐
相关产品推荐

