1

この質問にはさまざまなバリエーションがありますが、null 値の比較について尋ねると、それらはすべてパフォーマンスとインデックスについて話しているようです。

私の問題は、日付パラメーターに基づいて比較している null を返すことができるネストされた SELECT があることです。

SELECT a.* 
FROM Table_One a,
     Table_Two b
WHERE a.Fieldc IN (SELECT CompareValue from Table_Three cv WHERE inDate between cv.Date_ and SYSDATE)
AND a.Fielda = b.Fieldb(+)

ここでネストされた選択が null を返すと、左の結合が台無しになるようです。

必要に応じて、いくつかの偽のデータを喜んで含めますが、何かが足りないだけかもしれません。私が発生する必要があるのは、Fieldc 比較がその日付指定内でのみ発生することです。

洞察をありがとう。ありがとう。

さらに詳しい情報:

Table_One データ: すべてのフィールドは varchar2 です

Fielda | Fieldb | Fieldc|
'aVal' | 'bVal' | 'cVal'|
'dVal' | 'eVal  | 'fVal'|
'dVal' | 'fVal  | 'eVal'|

Table_Two データ: すべてのフィールドは varchar2 です

Fielda | Fieldb | Fieldc|
'aVal' | 'bVal' | 'cVal'|
'dVal' | 'fVal  | 'gVal'|
'dVal' | 'fVal  | 'cVal'|

Table_Three データ: CompareValue は varchar2、date_ は日付

CompareValue | date_      |
'fval'       | 2012-09-10 |

したがって、パラメーターが今日の場合、select は 'fval' を返し、正しく結合されたままになります。ただし、日付パラメーターが '2012-09-10' より前の場合、ネストされた選択は null を比較し、左結合は正しく行われません。これは、元のバージョンを少し簡略化したものです。

ありがとう

4

3 に答える 3

6

NVL(inDate, sysdate+1)null の場合に一致しないように使用

于 2012-09-11T21:16:47.627 に答える
0

No recordsとの値の違いを理解する必要がありNullます。「日付パラメーターが '2012-09-10' より前の場合、ネストされた選択が null を比較しており、左結合が適切に行われない」と言うと、これは行をSELECT返しますが、行の値はNULL(これはレコードなしとは異なります)。この場合、列の値に対して実行NVLし、NULLそれを偽の文字列に置き換えると(あなたが言ったように)、次のように機能します-

SELECT NVL(CompareValue,'dummy') 
  from Table_Three cv WHERE inDate between cv.Date_ and SYSDATE

上記のdummy場合CompareValueNULL返されますが、クエリが NO RECORDS をまったく返さない場合は返されません。

ただし、データを見ると、 2012-09-10 より前のNULL場合、サブクエリが実際に NO RECORDS (と同じではない) を返すと思われる NULL 値の可能性はわかりません。inDateこの場合、クエリは完全に問題ないはずです (他の場所で何か問題が発生していない限り)。

于 2012-09-12T00:56:09.337 に答える
0

a.Fieldc が「アクティブ」と見なされるという条件でテーブル a から選択していると仮定します。これは、table_three では inDate が開始日と sysdate の間にあるためです。

したがって、常に結果を出したいわけではないと思います。代わりに、コードで空の結果を処理することをお勧めします。

残念ながら、あなたはあなたのケースについてこれ以上の情報を共有していないため、これ以上正確な回答をすることはできません.

于 2012-09-11T21:42:06.503 に答える