带有AND或复合语句的oracle特定SQL查询

带有AND或复合语句的oracle特定SQL查询,sql,oracle,plsql,oracle10g,Sql,Oracle,Plsql,Oracle10g,我有以下疑问 select * from TABLE where (to_date('1970-01-01 00:00:00','yyyy-MM-dd hh24:mi:ss') + (AUDITTIMESTAMP/60/60/24/1000)) < to_date('2012-11-18 10:06', 'yyyy-MM-dd hh24:mi:ss') AND (to_date('1970-01-01 00:00:00','yyyy-MM-dd hh24:mi:ss')

我有以下疑问

select * 
  from  TABLE
 where (to_date('1970-01-01 00:00:00','yyyy-MM-dd hh24:mi:ss') + (AUDITTIMESTAMP/60/60/24/1000)) < to_date('2012-11-18 10:06', 'yyyy-MM-dd hh24:mi:ss') 
   AND (to_date('1970-01-01 00:00:00','yyyy-MM-dd hh24:mi:ss') + (AUDITTIMESTAMP/60/60/24/1000)) > to_date('2012-11-17 22:06', 'yyyy-MM-dd hh24:mi:ss')  
   AND (
     --(COLUMNA like '%aaa%' AND COLUMNAA like '%aaaaaaaaaaaaa%')
       (COLUMNB like '%bbb%' AND COLUMNBB like '%bbbbbbbbbbbbbb%')
     --or(COLUMNC like '%ccc%' AND COLUMNCC like '%ccccccccccccccc%') 
     --or (COLUMND like '%ddd%' AND COLUMNDD like '%ddddddddd%')
     )
 order by COLUMN1_PK
选择*
从桌子上
其中(截止日期('1970-01-01 00:00:00','yyyy-MM-dd hh24:mi:ss')+(审核时间戳/60/60/24/1000))<截止日期('2012-11-18 10:06','yyyy-MM-dd hh24:mi:ss')
和(截止日期('1970-01-01 00:00:00','yyyy-MM-dd hh24:mi:ss')+(审核时间戳/60/60/24/1000))>截止日期('2012-11-17 22:06','yyyy-MM-dd hh24:mi:ss')
及(
--(类似于“%aaa%”的COLUMNA和类似于“%AAAAAAAAA%”的COLUMNAA)
(类似于列B的“%bbb%”和类似于列BB的“%bbbbbbbb%”)
--或(类似于“%ccc%”的COLUMNC和类似于“%ccccccc%”的COLUMNCC)
--或(类似于“%ddd%”的列和类似于“%ddd%”的列)
)
按第1列排序
对于复合语句或括号内语句中的每个条件,数据库中都有记录

但是当我在这个复合块中有一条语句时,就没有返回的记录了


如何更改此选项以解决此问题?

不是答案,只是一些调试帮助,以及丰富的代码格式。也许您可以将WHERE子句移动到列中,并保留未过滤的数据,以查看到底发生了什么。这通常会帮助你看到一些不明显的东西。您应该在结果集中看到,出现在C1或C2中的1将导致出现在C3中的1。试试看,然后回复

select 
  CASE 
    WHEN COLUMNA like '%aaa%' AND COLUMNAA like '%aaaaaaaaaaaaa%'  
    THEN 1 ELSE 0 END C1,
  CASE 
    WHEN COLUMNB like '%bbb%' AND COLUMNBB like '%bbbbbbbbbbbbbb%' 
    THEN 1 ELSE 0 END C2,
  CASE WHEN (
    (COLUMNA like '%aaa%' AND COLUMNAA like '%aaaaaaaaaaaaa%') OR
    (COLUMNB like '%bbb%' AND COLUMNBB like '%bbbbbbbbbbbbbb%') 
    THEN 1 ESLE 0 END C3
from  TABLE
where date '1970-01-01' + AUDITTIMESTAMP/60/60/24/1000
  between timestamp '2012-11-17 22:06:01' and timestamp '2012-11-18 10:05:59'
order by COLUMN1_PK

这不是答案,只是一些调试帮助和奢侈的代码格式。也许您可以将WHERE子句移动到列中,并保留未过滤的数据,以查看到底发生了什么。这通常会帮助你看到一些不明显的东西。您应该在结果集中看到,出现在C1或C2中的1将导致出现在C3中的1。试试看,然后回复

select 
  CASE 
    WHEN COLUMNA like '%aaa%' AND COLUMNAA like '%aaaaaaaaaaaaa%'  
    THEN 1 ELSE 0 END C1,
  CASE 
    WHEN COLUMNB like '%bbb%' AND COLUMNBB like '%bbbbbbbbbbbbbb%' 
    THEN 1 ELSE 0 END C2,
  CASE WHEN (
    (COLUMNA like '%aaa%' AND COLUMNAA like '%aaaaaaaaaaaaa%') OR
    (COLUMNB like '%bbb%' AND COLUMNBB like '%bbbbbbbbbbbbbb%') 
    THEN 1 ESLE 0 END C3
from  TABLE
where date '1970-01-01' + AUDITTIMESTAMP/60/60/24/1000
  between timestamp '2012-11-17 22:06:01' and timestamp '2012-11-18 10:05:59'
order by COLUMN1_PK

如果你所说的事情真的发生了,那将是最令人惊讶和担忧的,因为这将表明甲骨文有严重的问题。幸运的是,情况并非如此:因为未编译条件在两列上都匹配,而不仅仅是第一列

你所看到的最可能的解释是你的数据有问题,或者更确切地说是你对数据的理解有问题。在指定的时间范围内,您没有任何与COLUMNB和COLUMNBB匹配的记录



如果您不同意此评估,请发布足够有代表性的数据作为测试用例

如果你所说的事情真的发生了,那将是非常令人惊讶和担忧的,因为这将表明甲骨文有严重的问题。幸运的是,情况并非如此:因为未编译条件在两列上都匹配,而不仅仅是第一列

你所看到的最可能的解释是你的数据有问题,或者更确切地说是你对数据的理解有问题。在指定的时间范围内,您没有任何与COLUMNB和COLUMNBB匹配的记录



如果您不同意此评估,请发布足够有代表性的数据作为测试用例

您的意思是,在其发布的表单中,将返回记录,但是如果您取消注释以下
或(COLUMNC-like“%bbb%”和…
行,则不会得到任何记录?我不这样认为。不..问题是,如果我取消注释(COLUMNA-like“%aaa%”和COLUMNAA-like“%aaaaaaaaaaaaaaaaa%”)并将或添加到下一行,将返回结果,并仅对第1列计算所有结果。.ignores and COLUMNBB like“%bbbbbbbbbb%”部分…您最后的注释(部分)与您在问题中所说的相矛盾,因此只是弄脏了水。请发布一些有代表性的数据,并向我们展示预期和实际输出。正如我所了解的,这个问题的原因是当我们遇到一个OR时,它将忽略整个块前的语句,并在OR后执行该子句,因此忽略所有部分t日期过滤是怎么做的。你是说在其发布的表单中,会返回记录,但如果取消对以下
行的注释(COLUMNC,如“%bbb%”和…
行,则不会得到任何记录?我不这么认为。不..问题是,如果我取消注释(COLUMNC,如“%aaa%”和COLUMNAA,如“%aaaaaaaaaaaaaaaaaaaaaaaaaaaaa%”)并将或添加到下一行,将返回结果,并仅对第1列计算所有结果。.ignores and COLUMNBB like“%bbbbbbbbbb%”部分…您最后的注释(部分)与您在问题中所说的相矛盾,因此只是弄脏了水。请发布一些有代表性的数据,并向我们展示预期和实际输出。正如我所了解的,这个问题的原因是当我们遇到一个OR时,它将忽略整个块前的语句,并在OR后执行该子句,因此忽略所有部分t帽子做日期过滤。