列に基づいて比較しようとしています。列>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' になることに注意してください。