1

列に基づいて比較しようとしています。列>5の場合としましょう。

select * where column>5

列に数字以外が含まれています。Oracle では文字列を比較できると思いました (Java のように)。

どうやらこれは許可されていません。

ORA-01722: invalid number
01722. 00000 -  "invalid number"

非数値フィールドと比較する方法はありますか?
ありがとう

4

5 に答える 5

5

はい、5 を引用符で囲む必要があります。

select * from table where column > '5'
于 2012-07-31T13:43:32.987 に答える
3

なぜそれが機能しないのかについてもう少し光を当てること。

5文字リテラルの代わりに数値リテラルを使用する場合、'5'Oracleは暗黙的なデータ型変換を実行し、テーブル内のすべての値を数値に変換しようとします。そのため、そのエラーが発生します。

暗黙的なデータ型変換に依存しないでください。それはいつかあなたに問題を与えるに違いない。

これで、文字リテラル('5')を文字列と正しく比較すれば、データ型の変換は不要であり、エラーは発生しません。

ただし、Oracleが実際に数値比較を行うことを期待している場合は、間違いです。文字列はASCII値に基づいています。そのため、最初の文字は。より低くランク付けされるため、(文字)値'10'は(文字)値'よりも低くなります。'2'1''2'

于 2012-07-31T14:03:44.390 に答える
3

列が の場合、次のようになりますvarchar2

select * from some_table where some_column > 5

...すべての列の値を数値に暗黙的に変換するため、実際には次のようになります。

select * from some_table where to_number(some_column) > 5

to_number()数値ではない値にヒットすると、見えなくてもORA-01722が発生するのはこれです。列の値に対して呼び出される関数は、使用されているインデックスも停止します (少し単純化しすぎています)。

他の人が言ったようにするwhere some_column > '5'か、またはwhere some_column > to_char(5). ただし、数値比較ではなく文字列比較であるため、比較には注意が必要です。so'10'は;とは見なされません。> '5'また、NLS 並べ替えパラメーターによって、予期しない結果が生じる可能性があります。さらに重要なことに、他の誰かの NLS パラメーター (たとえば、これをライブにすると) は、予期しない結果を生成し、環境で得た結果と一致しない可能性があります。詳細については、ドキュメントを参照してください

number列は数値を保持するために使用し、date列は日付などを保持するために使用し、varchar2テキスト値のみを保持する必要があります。

于 2012-07-31T14:01:38.633 に答える
1

to_char機能を使用できます

select * from table where column > to_char(5)
于 2012-07-31T14:00:56.253 に答える
0

テーブルがありません:

select * where FROM tablename column>5

ただし、これは列が数値の場合にのみ機能します。でないと使えません>


文字列を比較するには、LIKEまたはを使用できます。STRCMP()これらの例は、こちらで確認できます。


@Gerrat で述べられているように、>andも使用できます<が、両側の型に互換性がある必要があります (数値と数値またはテキストとテキスト)。詳細については、こちらをご覧ください

テキスト比較では、各文字を個別に比較するため、'11' は < その '2' になることに注意してください。

于 2012-07-31T13:42:29.343 に答える