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 instr(decode(:流程类型条件, '-1', a.流程类型编号, :流程类型条件), a.流程类型编号) > 0
这个我看不明白,谁帮我分析下,这2个函数我知道作用。

解决方案 »

  1.   

    decode(表达式,值1,结果1,值2,结果2....,其它)
    计算表达的值,如果为值1,函数的结果就是结果1,如果为值2,函数的结果就是结果2
    如果都没有匹配,函数的结果就是其它
    instr(串1,子串)
    在串1中查找子串,如果找到则返回子串在串1中的开始位置,如果没有找到,则返回0
      

  2.   

    instr(decode(:流程类型条件, '-1', a.流程类型编号, :流程类型条件), a.流程类型编号) > 0
    如果输入:流程类型条件=-1
        上面这个表达式永远为TRUE
    如果输入其它
        如果 :流程类型条件 包含 a.流程类型编号 
             则上面这个表达式为TRUE
       含则
             上面这个表达式为FALSE
      

  3.   

    我现在的问题是 写的存储过程要根据很多条件查询,有些条件用户不输入,我想在存储过程里就忽略这些查询条件,在存储过程里怎么处理?因为是用存储过程,所以不能在程序里组装SQL,当然也可以用动态SQL,但是我写的语句比较长,而且里面单引号较多,所以也妥。
      

  4.   

    网上原文:
    系统中遇见了要处理多条件组合查询的情况,好比说有4个独立的条件,那么组合出的查询条件便有24种,不可能写24条Sql语句再分别指定给24种组合情况吧,条件数再多点呢,人都会搞疯的。于是我求助于高手,获得了使用instr()和decode()函数的实现方法。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
    我遇到的是这样的问题,instr(decode(:节点名称条件, ’-1’, e.处理动作, :节点名称条件),
                     e.处理动作) > 0
    ,这句话能实现我不输入一个条件,就不根据这条件查询?不明白。注:这2个函数我会用,不用为我解释用法。
      

  5.   

    我思维太死了,用这2个函数代替like,知了