我有以下查询..
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语句中的每个条件,数据库中都有记录。
但是当我在这个复合块中有一个语句时,没有任何记录返回。
如何更改此问题以解决此问题?
答案 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