有没有可替代substr的函数适配所有数据?SQL字符串匹配问题咨询
SQL匹配异常修复方案
问题根因
你原有代码采用固定位置截取substr、硬编码拼接4个空格的逻辑,依赖trx_number中-前的空格数固定为4个,当出现空格数不足4个的场景时就会匹配失败。
解决方案
方案1:通用兼容方案(所有数据库支持,无需正则)
核心逻辑是移除两个字段中的所有空格后再做匹配,完全规避空格数量不统一的问题:
AND REPLACE(rct.trx_number, ' ', '') = SUBSTR(REPLACE(ap.invoice_num, ' ', ''), 1, 8) || SUBSTR(REPLACE(ap.invoice_num, ' ', ''), 10) -- 可选校验invoice_num格式符合要求的条件,不需要可以删掉 AND SUBSTR(REPLACE(ap.invoice_num, ' ', ''), 9, 1) = 'B'
方案2:正则简化写法(支持正则的数据库可用,Oracle/MySQL8+/PostgreSQL/SQL Server2017+均支持)
用正则直接替换掉invoice_num中8位数字后的B即可匹配:
AND REGEXP_REPLACE(ap.invoice_num, '^(\d{8})B(.*)$', '\1\2') = rct.trx_number
效果验证
两种方案都可以覆盖你给出的两组测试场景:
- 第一组数据:
rct.trx_number='69362695 -901645'ap.invoice_num='69362695B -901645'
匹配正常 - 第二组数据:
rct.trx_number='15428234 -0001006048'ap.invoice_num='15428234B -0001006048'
匹配正常
内容的提问来源于stack exchange,提问作者Somya
相关产品推荐
相关产品推荐

