0
Select count(*) from table where loc between 300 to 400. 
  1. locvarchar 列です。
  2. すべてのデータを選択しているわけではありません
  3. カウントを確認すると、ORA :01722 エラーが発生します
  4. エラーで結果をエクスポートします。

コメントから編集:

loc には、300 未満、400 を超える値、および 'GT' 、 '3KT1' などの英数字が含まれます

4

2 に答える 2

0

locvarchar 列です。
[コメントより] Loc 列には、GJ、3KT1 と同様に char 型の値があります

LOC数値に変換できない値が含まれています。WHERE 句の述語は数値として定義されているため、これは重要です。そのため、Oracle は暗黙的to_number(loc)にクエリに適用します。これが、適切なデータ型を使用することがベスト プラクティスである理由です。今は役に立ちませんが、教訓を学び、数値データには NUMBER 列を使用してください。

それまでの間、shonky データ モデルを処理するためのいくつかのオプションがあります。

幸運にも Oracle 12c R2 を使用している場合は、新しい関数を使用して、数値にキャストできないVALIDATE_CONVERSION()値を除外できます。詳細を見るloc

以前のバージョンの Oracle を使用している場合は、独自の関数を作成できます。

create or replace function is_number
    (p_str in varchar2) return number 
is 
    n number;
    rv number;
begin 
    begin
        n := to_number(p_str);
        rv := 1;
    exception
        when invalid_number then
             rv := 0;
    end;
    return rv;
end;

最も弱いオプションは、述語を文字列にキャストすることです。、およびおそらく望まない他のさまざまな値where loc between '300' to '400'が含まれます。'3000''4'

これはLiveSQL のデモです (無料の Oracle Technet アカウントが必要です、悲しいかな)

于 2018-07-03T05:46:59.450 に答える