如何不从不喜欢条件的地方排除null?

时间:2013-04-08 14:53:53

标签: sql oracle oracle10g

在我的查询的where子句中,如果我在where子句中包含条件,例如

where 
      T2.Comments not like '%ABC%' 
  and T2.Comments not like '%xyz%'

它还会过滤空白/空注释。 我不希望它过滤掉null或空格。

过滤掉例如的另一种方式是什么? ABCxyz并且也不排除空值/空格?

其余的caluse ...(在添加底部两个条件之后我没有得到任何空值。

Where
    T1.OUT_NO = T2.OUT_NO 
AND T3.OUT_NO = T1.OUT_NO 
AND CAUSE_CAP.CAUSE_NO NOT IN (1,3,5,7,9) 
AND ("T1"."TIME_STAMP">=TO_DATE ('01-04-2013 00:00:00', 'DD-MM-YYYY HH24:MI:SS') AND "T1"."TIME_STAMP"<TO_DATE ('06-04-2013 23:59:59', 'DD-MM-YYYY HH24:MI:SS')) 
AND NOT (CAUSE_CAP.CAUSE_NO = 13 AND START_TABLE.TABLE_NO = 83)
AND T2.Comments not like '%ABC%'
AND T2.Comments not like '%XYZ%'

3 个答案:

答案 0 :(得分:8)

只需添加NULL作为具体案例。 [编辑以显示如何将此方法推广到OP更复杂的查询]

Where
    T1.OUT_NO = T2.OUT_NO 
AND T3.OUT_NO = T1.OUT_NO 
AND CAUSE_CAP.CAUSE_NO NOT IN (1,3,5,7,9) 
AND ("T1"."TIME_STAMP">=TO_DATE ('01-04-2013 00:00:00', 'DD-MM-YYYY HH24:MI:SS') AND "T1"."TIME_STAMP"<TO_DATE ('06-04-2013 23:59:59', 'DD-MM-YYYY HH24:MI:SS')) 
AND NOT (CAUSE_CAP.CAUSE_NO = 13 AND START_TABLE.TABLE_NO = 83)
AND (T2.Comments IS NULL OR 
        (T2.Comments not like '%ABC%'
         AND T2.Comments not like '%XYZ%')
    )

答案 1 :(得分:2)

如果条件为(column LIKE 'somecode'),则会从结果中排除所有NULL值。只有非null的行才能导致条件为真。所以,我想你想要:

where  
      (   (   T2.Comments not like '%ABC%' 
          and T2.Comments not like '%xyz%'
          )
      or  T2.Comments IS NULL 
      )

AND的优先级高于OR,因此不需要内括号,只是为了清晰起见而添加(如@ horse_with_no_name的注释)。如果您只有这种情况,则不需要外部的那些。

在其他DBMS中,您还需要or T2.Comments = ''但不需要Oracle,因为NULL和空字符串对于char列是相同的。

答案 2 :(得分:0)

将其放入“与众不同”的陈述中可以使意图变得清楚,并缩短代码以提供更好的概述。

    and (T2.Comments not like all ('%ABC%','%xyz%') or T2.Comments is null)