1

一部のシステムでは、varchar2列から値を選択しようとすると、無効な数値エラーメッセージが表示されるのに、他のシステムではまったく同じことを実行してもエラーが表示されない理由を理解しようとしています。

テーブルは次のようなものです。

ID   Column_1  Column_2
 1         V     text
 2         D        1
 3         D        2
 4         D        3

とクエリ:

select ID
  from table
 where column_1='D'
   and column_2 = :some_number_value

:some_number_valueは常に数値ですが、nullにすることもできます。

クエリを修正しました:

select ID
  from table
 where column_1='D'
   and column_2 = to_char(:some_number_value)

この元のクエリはほとんどのシステムで正常に実行されますが、一部のシステムでは「無効な番号」エラーが発生します。問題はなぜですか?一部のシステムではなく、ほとんどのシステムで機能するのはなぜですか?

4

1 に答える 1

3

これは、条件がチェックされる順序によって異なります。の条件column_1が最初に評価される場合、数値への暗黙の変換がcolumn_2機能します。が最初にチェックされている場合、数値へcolumn_2の変換はtext失敗します。

オプティマイザーは、条件が評価される順序を決定します。たとえば、インデックスがオンになっているがオンになってcolumn_2いないcolumn_1場合、このインデックスが使用される可能性があるため、変換は失敗します。


「some_number_valueは常に数値ですが、nullになる可能性があります」とはどういう意味ですか?のチェックでcolumn_2 = NULLは行が返されません。NULL評価できるのはIS NULL、ではなく、を使用した場合のみ= NULLです。

于 2010-05-11T07:13:11.153 に答える