列に基づいて比較しようとしています。列>5の場合としましょう。
select * where column>5
列に数字以外が含まれています。Oracle では文字列を比較できると思いました (Java のように)。
どうやらこれは許可されていません。
ORA-01722: invalid number
01722. 00000 - "invalid number"
非数値フィールドと比較する方法はありますか?
ありがとう
はい、5 を引用符で囲む必要があります。
select * from table where column > '5'
なぜそれが機能しないのかについてもう少し光を当てること。
5
文字リテラルの代わりに数値リテラルを使用する場合、'5'
Oracleは暗黙的なデータ型変換を実行し、テーブル内のすべての値を数値に変換しようとします。そのため、そのエラーが発生します。
暗黙的なデータ型変換に依存しないでください。それはいつかあなたに問題を与えるに違いない。
これで、文字リテラル('5'
)を文字列と正しく比較すれば、データ型の変換は不要であり、エラーは発生しません。
ただし、Oracleが実際に数値比較を行うことを期待している場合は、間違いです。文字列はASCII値に基づいています。そのため、最初の文字は。より低くランク付けされるため、(文字)値'10'
は(文字)値'よりも低くなります。'2
'1'
'2'
列が の場合、次のようになります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
テキスト値のみを保持する必要があります。
to_char
機能を使用できます
select * from table where column > to_char(5)
テーブルがありません:
select * where FROM tablename column>5
ただし、これは列が数値の場合にのみ機能します。でないと使えません>
。
文字列を比較するには、LIKE
またはを使用できます。STRCMP()
これらの例は、こちらで確認できます。
@Gerrat で述べられているように、>
andも使用できます<
が、両側の型に互換性がある必要があります (数値と数値またはテキストとテキスト)。詳細については、こちらをご覧ください。
テキスト比較では、各文字を個別に比較するため、'11' は < その '2' になることに注意してください。