带有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帽子做日期过滤。