sql >> データベース >  >> RDS >> Oracle

Oracle SELECT-二重引用符または二重引用符なし?

    大文字と小文字に関する回答とリンクは正しいですが、列名がアンダースコアで始まっていることと、クライアントが通常は引用符を隠していることから、状況は単純なケースの問題を少し超えています。

    _idという列を持つテーブルを作成しようとした場合 、引用符を付けないと、「ORA-00911:無効な文字」エラーが発生します。その原因テキストには、「識別子は文字と数字以外のASCII文字で始まらない可能性があります」と記載されています。数字で始めることもできないため、これも実際には間違っています(たとえば、0_id 'ORA-00904 ::無効な識別子')を与えます。これは、データベースオブジェクトの命名規則> :

    したがって、Aqua Data Studioは、指定したオブジェクト名の大文字バージョンを二重引用符で囲むという規則に従っているようです。これは、リンクされた投稿の1つに記載されています。

    表示した内容から、select _id from ... select "_ID" from ...としてOracleに渡されます 、列名が"_ID"として作成されている場合は問題ありません。 。 table1の場合のようです 、ただしtable2 "_id"として作成されました -ケースの不一致により、表示されている正当なORA-00904が生成されます。

    クライアントは、すでに二重引用符で囲まれている列名を変更していないため、select "_id" from ... そのままOracleに渡され、table2に対して正常に機能します。 (ただし、逆に、table1では失敗します 。

    Oracleでは、引用符で囲まれていない識別子の規則に従わない場合、および引用符で囲まれて作成された場合、名前を二重引用符で囲む必要があります。ただし、元の引用符で囲まれた値が有効である場合、つまり引用符で囲まれていない規則に従って大文字で入力されている場合を除きます。列名はアンダースコアで始まるため、Oracleに関する限り、列名へのすべての参照は、大文字と小文字を区別せずに二重引用符で囲む必要があります。自分で引用していない場合、クライアントはバックグラウンドでそれを実行しているだけです。

    引用符で囲まれた識別子を避け、引用符で囲まれていない有効な名前を常に使用するように他の人が与えたアドバイスに従うと、このような問題を回避できます。



    1. Oracleのカーソルを使用してレコードを挿入および更新します

    2. Exists1またはExists*を使用したサブクエリ

    3. データ集約mongodbとmysql

    4. pl/sqlのxmlelementを使用してすべてのリレーショナル表データを取得します