在查询的where子句中,如果我在where子句中包括条件,例如
where
T2.Comments not like '%ABC%'
and T2.Comments not like '%xyz%'
它还过滤掉空白/空注释。我不希望它过滤掉null或空格。
[例如, ABC
和xyz
还不排除空值/空白吗?
剩余的位置..(在添加了底部两个条件之后,我没有得到任何空值。
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%'
仅在特定情况下添加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%')
)
[条件为(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
和空字符串是相同的。
将其放入“与众不同”的陈述中可以使意图清楚,并缩短代码以得到更好的概述。
and (T2.Comments not like all ('%ABC%','%xyz%') or T2.Comments is null)