0

Oracle での Null に関する別の質問があります。

セッションテーブルとして使用される小さなテーブルがあります。各行は特定のセッションです。セッションが正常に終了した場合、最後の列はバージョン番号を示し、セッションがドロップされた場合は null を示します。

この列は null になる可能性があり、最大バージョン番号または null を sessionNumber 変数に選択したいと考えています。これは私が設定したオリジナルでした

SELECT MAX (VerNumber) INTO sessionNumber
FROM Table_A
WHERE sessionDate = -- some date
AND VerNumber IS NOT NULL;

colがnullの場合、これは1行を返します

このようにNVLを使用してみました

SELECT NVL(MAX (VerNumber),NULL) INTO sessionNumber
FROM Table_A
WHERE sessionDate = -- some date
AND VerNumber IS NOT NULL;

混乱を解消するために、NOT NULL 条件が存在して、同じユーザーによる同じ日付の余分なセッションを防ぎます。この状況で TBH NOT NULL 条件が削除されても、(空の) 行が返されます。Null と集計関数に欠けているものがあると思います。

しかし、うまくいきません。例外を使用できる場所も見ましたが、それは複雑な修正のようです。

どんなガイダンスも大歓迎です。

ありがとう。

要求に応じてさらに明確化。

私のテーブルには、user、date、state、および verNumber の 4 つの列があります。

user と date は識別子列です (正式には PK ではありませんが、そのように見ることができます)。

state セッションが完了したかどうかを示します verNumber は、その日付のセッションが完了した回数を示し、その日付のセッションが完了していない場合は null になる可能性があります。

その日付に利用可能な MAX(VerNumber) または日付が利用できない場合または VerNumber の値が null の場合に null を割り当てたい変数 sessionNumber があります。

Table_A のサンプル行

USER    | DATE       | STATE | VERNUMBER
'AName' | 2012-06-25 | 'YES' | 1
'CName' | 2012-06-25 | 'YES' | 2
'BName' | 2012-06-26 | 'NO'  | --NULL

したがって、日付が 06-25 の場合は 2 が値であると予想され、06-26 の場合は null が予想されます。

4

2 に答える 2

2

これはあなたが望むものに近いですか?

http://sqlfiddle.com/#!4/ca465/1

間違った木を吠える?

編集:最後のものを忘れてください

…これで合ってますか!?

http://sqlfiddle.com/#!4/44e50/21

最後のセッションでは(ユーザーに関係なく)、日付ごとに1つのエントリが必要かもしれないと考えています-どちらにしても、これによりいくつかのヒントが得られます

編集:これがそのクエリです:

http://sqlfiddle.com/#!4/4163d/1

これはあなたの出力を反映していると思います!

全員の利益のために (そして SQL フィドルが爆発した場合に備えて!)、私が行った最終的なクエリは次のとおりです。

SELECT Table_A.* FROM 
(
    SELECT
        SessionDate, 
        MAX(CASE WHEN VerNumber IS NULL THEN 'A' ELSE VerNumber END) as Ver
    FROM Table_A
    GROUP BY SessionDate
) TD
INNER JOIN Table_A 
ON NVL(Table_A.VerNumber, 'A') = TD.Ver 
AND Table_A.SessionDate = TD.SessionDate

したがって、基本的に CASE を使用して VerNumber 列の式の MAX を取得しましたが、アルファ文字を使用して、その列の NULL が MAX によって選択されたことを確認しました。外側のクエリは、内側のクエリで NULL を 'A' に結合できるようにする NVL() を使用して式の内側に結合します。照合がここで問題を引き起こすかどうかはわかりません (照合により、アルファと数値の並べ替え順序が変更されることはありますか??)

于 2012-06-27T15:41:28.790 に答える
1

選択で集計関数を単独で使用すると、常に行が取得されます。行を返さない場合は、別の列を追加して GROUP BY を使用し、その列を次のようにフィルタリングする必要があります。

SELECT VerNumber, MAX (VerNumber) 
  INTO sessionNumber 
  FROM Table_A 
 WHERE sessionDate = -- some date 
   AND VerNumber IS NOT NULL
 GROUP BY VerNumber; 

あなたのデータがどのように構造化されているかわかりませんので、これは正確な解決策ではないかもしれません。コメントした他の人と同じように、あなたがやろうとしていることについて、私も少し混乱しています。

ただし、これを行うと、NO DATA FOUND 例外が発生するため、例外ハンドラが必要になることに注意してください。

于 2012-06-27T15:43:45.293 に答える