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

时间:2012-11-17 23:43:07

标签: 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') + (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

对于括号内复合OR语句中的每个条件,数据库中都有记录。

但是当我在这个复合块中有一个语句时,没有任何记录返回。

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

2 个答案:

答案 0 :(得分:3)

如果您所说的事情真的发生了,那将是最令人惊讶的,并且令人担忧,因为它表明甲骨文出现了一些严重错误。幸运的是情况并非如此:由于this SQL Fiddle demonstrates未组合条件 匹配两列,而不仅仅是第一列。

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


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

答案 1 :(得分:2)

不是答案,只是一些代码格式化的调试帮助。也许您可以将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