0

IMS セグメントに接続し、where 句で主キーを使用して SQL クエリを実行し、* クエリを選択することができます。しかし、別の列で選択しようとすると、語彙エラーが発生します。

Select * from table where column-name='something'

これにより、例外'Exception in thread "main" com.ibm.ims.jdbc.TokenMgrError: Lexical error at line 1, column 42. Encountered: "-" (45), after : ""' が発生します。列名を名とすると、名のハイフンの位置で字句エラーが発生します。Prepared Statement を使用してこれを実行しようとしましたが、まだ機能しません。

次の変更を行った後でも、例外が発生します。Select * from table where 'column-name'='something' 原因: com.ibm.ims.jdbc.ParseException: Encountered " "\'column-name\' "" at line 1, column 36. : ... "(" .. .

select * from table where column+'-'+name='something' '-' で語彙エラーの例外

無効なエスケープ シーケンス (有効なものは \b \t \n \f \r \" \' \ です)。これは、バッククォートまたはエスケープ シーケンスを追加しようとしたときに表示されるメッセージです。

4

2 に答える 2

5

SQL のほとんどの方言では、この-文字は (区切りなしの) 識別子では有効な文字ではありません。たとえば、SQL-92 仕様には次のように記載されています。

     <identifier> ::=
          [ <introducer><character set specification> ] <actual identifier>

     <actual identifier> ::=
            <regular identifier>
          | <delimited identifier>

     <SQL language identifier> ::=
          <SQL language identifier start>
            [ { <underscore> | <SQL language identifier part> }... ]

     <SQL language identifier start> ::= <simple Latin letter>

     <SQL language identifier part> ::=
            <simple Latin letter>
          | <digit>

(TL;DR - 文字、数字、アンダースコア)

( SQL 言語の動物学はさまざまな標準からの逸脱に満ちているため、すべての方言を言うのはためらわれます。)


これは %,_ にも当てはまりますか? %,_ でエスケープ シーケンスを許可しているいくつかのソリューションを確認できます。言及された解決策は、ハイフンにはまだ機能しません。参照: myitforum.com/cs2/blogs/jnelson/archive/2008/08/27/121684.aspx

まず、あなたが見つけた参照は、識別子名ではなく、文字列リテラルでのエスケープに適用されます。この問題には適用されません。(それはあなたの SQL ダイアレクトにも当てはまりますか?)

次に、上記の構文によれば、使用している SQL ダイアレクトが標準に従っている場合は、識別子にアンダースコアを使用できます。

第 3 に、標準では「区切り識別子」(区切り文字として二重引用符を使用) について説明しています。これが実際の SQL ダイアレクトでどれだけ広くサポートされているかはわかりませんが、使用できる文字に制限がある場合でも、その他の注意事項があると思います。

第 4 に、SQL 標準の内容に関係なく、使用している特定の方言の文書化された構文を確認する必要があります。(私はSQLの一般的な特性を説明するためにのみ使用していました...実際に使用している方言の詳細がない場合。「メインフレーム」SQLは多くのものになる可能性があります。)

最後に、識別子に「ファンキーな文字」を使用しない方がよいでしょう。ラテン文字、数字、およびアンダースコアを使用してください... SQL ダイアレクトでそれが許可されていない場合でも、許可されているものに固執してください。

そして、ベンダーの SQL ドキュメントを読んでください!!!

@Rob両方を試しましたが、うまくいきませんでした。

ベンダーの SQL ドキュメントをよく読んでください。何がうまくいくかを教えてくれるはずです。そして、それができないと言われたら...まあ、できません。

于 2012-06-06T13:42:38.560 に答える
2

ハイフンと呼ばれるものは、データベースによってマイナス記号として解釈されると思われます。

- を削除するか、マイナス記号として解釈されないように引用符で囲みます。

于 2012-06-06T12:54:03.233 に答える