select WORKINFO.*
  from WORKINFO
 WHERE to_char(createdate, 'yyyy') = '2015'
   AND WORKINFO.IsValid = 1
   AND (completeDate is not null and to_char(completeDate, 'YYYY') = '2015')
   and (APPROVALDEPT in (select s.oid
                           from sysorgan s
                          where s.parentorganoid = 1
                             or s.oid = 1) or
        dutydeptoid in (select s.oid
                          from sysorgan s
                         where s.parentorganoid = 1
                            or s.oid = 1))
   and workStatus >= 1
   and isvalid = 1
   AND (extend4 = 2 or extend4 is null )
 ORDER BY DutyDeptOID ASC, WorkInfoNum DESC
select WORKINFO.*
  from WORKINFO
 WHERE to_char(createdate, 'yyyy') = '2015'
   AND WORKINFO.IsValid = 1
   AND (completeDate is not null and to_char(completeDate, 'YYYY') = '2015')
   and (APPROVALDEPT in (select s.oid
                           from sysorgan s
                          where s.parentorganoid = 1
                             or s.oid = 1) or
        dutydeptoid in (select s.oid
                          from sysorgan s
                         where s.parentorganoid = 1
                            or s.oid = 1))
   and workStatus >= 1
   and isvalid = 1
   AND extend4 = 2 or extend4 is null 
 ORDER BY DutyDeptOID ASC, WorkInfoNum DESC

解决方案 »

  1.   

    仔细看一下 AND 及 OR 的逻辑运算符的规则。
      

  2.   

    or 在括号里面,结果集是过滤其他过滤条件后再加过滤条件extend4 = 2 和extend4 是空 得到的;
    or 在括号外面面,结果集是过滤其他过滤条件加extend4 = 2过滤得到的结果,再把extend4 是空过滤 得到的结果并在一起。比如:
    学校有3个班级,第一个过滤条件是班级1,第二个过滤条件是 男生 或 生日在1月份的
    按你的写法区别就是:
    1、得到班级1里面的所有男生和1月生日的女生;
    2、得到所有3个班级的1月生日的学生和班级1的男生。
    2的结果比1多了班级2和班级3的1月生日的学生。明白了?
      

  3.   

    or 和and 的优先级问题。
      

  4.   

    优先级不一样 not>and>or   就像10*(2+3)跟10*2+3  
      

  5.   

    就和我们数学中加减法的优先级一样,加个括号,身份档次就上去了,干啥啥优先。NOT>AND>OR