2012-11-17 19 views
0

我有以下查詢..Oracle專用的SQL查詢與AND和OR複合語句

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 

對於括號內化合物或聲明的每個條件,有記錄在數據庫中。

但是,當我有這種化合物塊中一條語句,有返回回來沒有記錄。

我該如何改變這個問題來解決這個問題?

+0

你說,在貼出的形式,正在返回的記錄,但如果你取消以下'或(COLUMNC LIKE「%BBB%」 AND ...'行,你沒有記錄?我不希望這一點。 –

+0

沒有..the問題是,如果我取消 (COLUMNA LIKE '%AAA%' AND COLUMNAA LIKE '%aaaaaaaaaaaaa%') 並添加或到下一行,返回的結果, 和所有的結果在評估第一列only..ignores 和COLUMNBB LIKE「%bbbbbbbbbbbbbb%」的一部分... – Sanath

+1

你最後的評論(部分)違揹你在你的問題說了,所以只是muddies水。請發佈一些有代表性的數據和向我們展示預期產出和實際產出 – APC

回答

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 
3

如果你說的是真的發生的事情發生了這將是最令人驚奇和令人擔憂,因爲這將預示着什麼dramtaically錯甲骨文。幸運的是,情況並非如此:this SQL Fiddle demonstrates未複合條件確實匹配兩列,而不僅僅是第一個。

你所看到的最有可能的解釋是與你的數據有問題,或者說您對數據的理解。您在指定的時間範圍內沒有任何與COLUMNB和COLUMNBB匹配的記錄。


如果這個評價不同意請郵寄剛夠代表性的數據作爲測試用例。