Bootstrap

oracle中的多选查询条件匹配

动态多选参数查询数据时,需要动态生成sql,通常面临两种情况(两种传参可以在服务代码层中进行转换):

1、查询条件以列表collection的形式转入配置的xml中

比如传入条件参数['02','04'],就需要下面方式实现
 

<iterate open="(" close=")" conjunction="OR" property="statuss" >

instr(STATUS,#statuss[]#) > 0

</iterate>

2、查询条件以字符串string的形式转入配置的xml中

若是通过逗号分隔的参数拼接而成的字符串参数,比如‘02,04’,可以使用REGEXP_LIKE,以及INSTR匹配数据

两种写法 REGEXP_LIKE(',' || '02,04' || ',', ',' || STATUS || ',')INSTR('02,04', STATUS) > 0 都可以用来检查某个值是否存在于逗号分隔的字符串中,但它们各有优劣。让我们来详细比较这两种方法:

1. REGEXP_LIKE(',' || '02,04' || ',', ',' || STATUS || ',')

优点
  1. 精确匹配:通过将 STATUS 和目标字符串都转换为 ,value, 的形式,可以避免边界情况的问题,确保精确匹配。
  2. 可读性:使用正则表达式的方式通常更容易理解和维护,尤其是对于复杂的匹配逻辑。
  3. 灵活性:正则表达式可以处理更复杂的模式匹配,不仅仅局限于简单的包含检查。
缺点
  1. 性能:正则表达式的匹配通常比简单的字符串函数(如 INSTR)慢,特别是在处理大量数据时。
  2. 兼容性:不同数据库系统的正则表达式语法可能有所不同,需要特别注意。

2. INSTR('02,04', STATUS) > 0

优点
  1. 性能INSTR 函数通常比正则表达式更快,因为它只进行简单的字符串查找。
  2. 简单性INSTR 函数的使用非常简单,容易理解和编写。
  3. 兼容性INSTR 函数在大多数数据库系统中都有支持,具有很好的跨平台兼容性。
缺点
  1. 边界问题INSTR 函数可能会导致边界问题。例如,如果 STATUS 列的值是 '02',而目标字符串是 '02,04'INSTR 会正确匹配。但如果 STATUS 列的值是 '2'INSTR 也会错误地匹配。
  2. 不精确匹配:由于没有对边界进行处理,可能会导致误匹配。

示例比较

假设表 IPLAT_EQUIPMENTMAINTAIN.TYNGZ03 有以下数据:

IDSTATUS
101
202
303
404
505
62
使用 INSTR
SELECT COUNT(*)
FROM IPLAT_EQUIPMENTMAINTAIN.TYNGZ03
WHERE INSTR('02,04', STATUS) > 0

结果将是:

COUNT(*)
---------
3

因为 STATUS'02''04''2' 的记录都会被匹配。

使用 REGEXP_LIKE
SELECT COUNT(*)
FROM IPLAT_EQUIPMENTMAINTAIN.TYNGZ03
WHERE REGEXP_LIKE(',' || '02,04' || ',', ',' || STATUS || ',')

结果将是:

COUNT(*)
---------
2

因为只有 STATUS'02''04' 的记录会被正确匹配。

结论

  • 性能:如果性能是首要考虑因素,并且可以接受潜在的边界问题,使用 INSTR 会更合适。
  • 精确性和可读性:如果需要精确匹配并避免边界问题,或者代码的可读性和维护性更重要,使用 REGEXP_LIKE 会更好。
;