以下的文章主要介绍的是如何正确的使用Oracle Instr()和decode()函数来进行多条件的组合查询,在相关系统中我们经常遇到要处理的多条件组合查询的相关情况,使用instr()和decode()函数的实现方法。
下面先说明一下instr()的功能和语法:(函数的语法是从处得到的,相当清晰明了:)
InOracle/PLSQL,theinstrfunctionreturnsthelocationofasubstringinastring. Thesyntaxfortheinstrfunctionis: instr(string1,string2,[start_position],[nth_appearance]) string1isthestringtosearch. string2isthesubstringtosearchforinstring1. start_positionisthepositioninstring1wherethesearchwill start.Thisargumentisoptional.Ifomitted,itdefaultsto1. Thefirstpositioninthestringis1.Ifthestart_positionisnegative, thefunctioncountsbackstart_positionnumberofcharactersfrom theendofstring1andthensearchestowardsthebeginningofstring1. nth_appearanceisthenthappearanceofstring2.Thisisoptional.Ifomiited,itdefaultsto1.
再说明一下decode()的功能和语法:
InOracle/PLSQL,thedecodefunctionhasthefunctionalityofanIF-THEN-ELSEstatement. Thesyntaxforthedecodefunctionis: decode(expression,search,result[,search,result]...[,default]) expressionisthevaluetocompare. searchisthevaluethatiscomparedagainstexpression. resultisthevaluereturned,ifexpressionisequaltosearch. defaultisoptional.Ifnomatchesarefound,thedecodewillreturndefault. Ifdefaultisomitted,thenthedecodestatementwillreturnnull(ifnomatchesarefound).
综合使用得到的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