在我的查询的where子句中,如果我在where子句中包含条件,例如
where
T2.Comments not like '%ABC%'
and T2.Comments not like '%xyz%'
它还会过滤空白/空注释。 我不希望它过滤掉null或空格。
过滤掉例如的另一种方式是什么? ABC
和xyz
并且也不排除空值/空格?
其余的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%'
答案 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)