5

Oracle テーブルがあり、列 ( col1) の型はvarchar2(12 byte)です。1 行あり、値col11234

私が言ったら

select * from table where col1 = 1234

オラクルは無効な番号を言います。何故ですか?のときに数値を渡すことができないのはなぜvarchar2ですか?

編集: すべての応答は素晴らしいです。ありがとうございました。しかし、有効な varchar2 データ型である1234場合になぜ時間がかからないのか理解できません。1234

4

3 に答える 3

5

問題は、Oracleが暗黙的に1234を文字タイプにキャストすることを期待していることです。それどころか、Oracleは暗黙的に列を数値にキャストしています。列に数値以外の値があるため、Oracleはエラーをスローします。Oracleのドキュメントは、暗黙のキャストがどのように解決されるかを説明する直前に、暗黙のキャストに対して警告します。表示されている動作を説明するルールは次のとおりです。

文字値を数値と比較する場合、Oracleは文字データを数値に変換します。

于 2012-05-02T22:10:09.333 に答える
4

ああ、数値に変換するよりも文字に変換する方がはるかに優れています。

select *
from table
where col1 = to_char(1234)

col1 が数値のように見えない場合、to_number はエラーを返し、クエリを停止します。

于 2012-05-02T19:39:22.697 に答える
4

オラクルは無効な番号を言います。何故ですか?varchar2 の数値を渡せないのはなぜですか?

col1数値として比較しているため、Oracleは文字型から数値への暗黙的な変換を行います。

また、フェッチされている唯一の行である1234想定します。実際には、Oracle はテーブルからすべての行をフェッチしてから、where句に従って除外する必要があります。文字を数値に変換できないため、行col1に遭遇する前にフェッチされている文字値があり、エラーが発生しています。1234

このフィドルは動作を示しています。abc数値に変換できないため、そのエラーメッセージが表示されます


テーブル内の唯一のレコードが数字を含む col1 のレコードである場合、ステートメントが正常に機能することがわかります。

于 2012-05-03T05:19:19.200 に答える