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 OR 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 に答える