5

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

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

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

什么是另一种过滤掉的方法,例如。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%'
4

4 回答 4

10

只需添加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%')
    )
于 2013-04-08T14:55:58.753 回答
4

当您有条件时(column LIKE 'somecode'),所有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 列是相同的。

于 2013-04-08T14:55:55.800 回答
0

您也可以尝试使用案例陈述,它易于阅读,并为您提供了很大的灵活性来添加其他条件。

AND CASE WHEN t2.Comments IS NULL THEN 1
         WHEN T2.Comments like '%ABC%' THEN 0
         WHEN T2.Comments like '%xyz%' THEN 0
         ELSE 1 
         END = 1
于 2021-10-08T16:45:32.257 回答
-1

将其放入“并非全部”语句中可以明确意图并缩短代码以获得更好的概述。

    and (T2.Comments not like all ('%ABC%','%xyz%') or T2.Comments is null)
于 2020-02-28T10:57:00.900 回答