系统中遇到了要处理多条件组合查询的情况,好比说有4个独立的条件,那么组合出的查询条件便有24种,不可能写24条Sql语句再分别指定给24种组合情况吧,条件数再多点呢,人都会搞疯的。。。。于是我求助于高手,获得了使用instr()和decode()函数的实现方法。
下面先说明一下instr()的功能和语法:(函数的语法是从 http://www.techonthenet.com/oracle/functions/index.htm 处得到的,相当清晰明了:)
In Oracle/PLSQL, the instr function returns the location of a substring in a string.
The syntax for the instr function is:
instr ( string1 , string2 , [ start_position ], [ nth_appearance ])
_ _
_ string1 _ is the string to search.
_ _
_ string2 _ is the substring to search for in string1 .
_ _
_ start_position _ is the position in string1 where the search will start. This argument is optional. If omitted, it defaults to 1. The first position in the string is 1. If the start_position is negative, the function counts back start_position number of characters from the end of string1 and then searches towards the beginning of string1 .
_ _
_ nth_appearance _ is the nth appearance of string2 . This is optional. If omiited, it defaults to 1.
再说明一下decode()的功能和语法:
In Oracle/PLSQL, the decode function has the functionality of an IF-THEN-ELSE statement.
The syntax for the decode function is:
decode ( expression , search , result [, search , result]... [, default] )
_ expression _ is the value to compare.
_ search _ is the value that is compared against expression .
_ result _ is the value returned, if expression is equal to search .
_ default _ is optional. If no matches are found, the decode will return default . If default is omitted, then the decode statement will return null (if no matches are found).
综合使用得到的SQL语句如下:
select e.到达日期,
e.角色名,
d.单据标题,
d.单据编号,
e.节点编号,
e.处理动作,
e.处理日期,
b.流程实例编号
from gzl_流程类型 a,
gzl_流程实例 b ,
gzl_流程定义 c,
dj_单据 d,
gzl_流程流转状态 e
where a.流程类型编号 = c.流程类型编号 and e.处理标记 = '是'
and e.用户id = 'tetdmis' and b.流程定义编号 = c.流程定义编号
and b.活动编号 = d.单据编号 and c.流程定义编号 = b.流程定义编号
and e.流程实例编号 = b.流程实例编号
and instr(decode(:流程类型条件, '-1', a.流程类型编号, :流程类型条件), a.流程类型编号) > 0
and (to_char(e.处理日期, 'yyyy-mm-dd') between :开始日期 and :结束日期)
and instr(decode(:节点名称条件, '-1', e.处理动作, :节点名称条件),
e.处理动作) > 0
最后得到的界面如下:
