如何在不符合条件的地方排除null?

问题描述 投票:2回答:3

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

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

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

[例如, ABCxyz还不排除空值/空白吗?

剩余的位置..(在添加了底部两个条件之后,我没有得到任何空值。

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%'
sql oracle oracle10g
3个回答
8
投票

仅在特定情况下添加NULL。 [编辑以显示如何将这种方法推广到OPs更复杂的查询中]

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%')
    )

2
投票

[条件为(column LIKE 'somecode')时,所有NULL值将从结果中排除。只有不为null的行可能导致条件为true。因此,我认为您想要:

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中则不需要,因为对于char列,NULL和空字符串是相同的。


0
投票

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

    and (T2.Comments not like all ('%ABC%','%xyz%') or T2.Comments is null)
© www.soinside.com 2019 - 2024. All rights reserved.