2011-07-05 1 views
1

Oracleバージョン:私は、データセットの最小値/最小値を見つけるために、MIN機能を使用しようとしているのOracle SQL - データセットのMIN値を検索しますが、MINの計算で値を除外

を10gの。 MINを実行している列は、VARCHAR2の列です。この列には数値を含めるか、値が適用されないことを表す ' - 'の値が含まれます。

カラムにMIN()関数を実行すると、常に ' - 'が返されます。
には、を除き、MINステートメントで ' - 'が計算されないようにしたいと考えています。文でWHERE句を使用して、有効なデータを除外するため ' - 'で列をフィルタリングすることはできません。

注:これは大規模な従来のクエリです(500行以上)ので、この膨大なクエリを書き直すことは実際の選択肢ではありません。

答えて

6

MIN(CASE WHEN ColX = '--' THEN NULL ELSE ColX END)

これは、SQL Serverで有効であると私はおそらく同様のOracle上で動作すると思います。

は、文字列フィールドに数値データを格納することはありません。

空間の観点からは効率が悪く、不等式比較を実行すると奇妙な結果が得られます。

あなたのテーブル内のこれらの行を持っている場合:

010 
009 
1 

MAX値は1になり、MIN値が

+0

私はvarcharとして数字を格納しないことに完全に同意します。なぜなら、NVL関数を使って ' - 'か数字を表示するかどうかを判断するビューであるからです。 – contactmatt

+0

@Contactmatt次に、他のテーブル/プロシージャでそのビューへの参照をチェックし、それを修正することを提案します。データが 'NULL'の場合は、' NULL21 'や他の数値を渡しましょう。例えば、-2147483647のようにあなたのデータで実際には不可能なことを知っておいてください。 – JNK

3

009は本当にあなただけの集計関数はこの値を避けたいでしょう。凝集体はヌルをスキップするので、ヌルに質問に値を変換:

min(case your_field 
    when '--' then null 
    else your_field 
    end) 

また、@JNKが指摘するように、文字列として数値を格納することは危険をはらんでいます。例えば、あなたの数字がすべて同じ長さにパッディングされていない限り、minは、おそらく文字列として '1000'が '2'より小さいという誤った結果を与えるでしょう。 floatまたはint関数を使用して文字列を実際の数値に変換することはできますが、数値以外の文字があればエラーになります。

+0

助けてくれてありがとうございます:) – contactmatt

関連する問題