0

我有以下查询..

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 语句中的每个条件,数据库中都有记录。

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

我怎样才能改变它来解决这个问题?

4

2 回答 2

3

如果您所说的正在发生的事情真的发生了,那将是最令人惊讶和令人担忧的,因为这表明 Oracle 出现了严重错误。幸运的是,情况并非如此:因为这个 SQL Fiddle 演示了未复合条件在两列上匹配,而不仅仅是第一列。

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


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

于 2012-11-18T04:43:20.703 回答
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
于 2012-11-18T02:54:24.590 回答