0

SQLについて質問があります。jDeveloper と oracle sql 開発者を使用しています。

検索の大文字と小文字を区別しないようにしたいので、次のように書きました。

        String word = jTextField5.getText();
        ResultSet rs = statement.executeQuery("SELECT NAMES, AUTHOR, ID FROM BOOKS WHERE NAMES LIKE '%"+word+"%' OR AUTHOR LIKE '%"+word+"%' COLLATE Latin1_General_CS_AS ");

しかし、エラーが発生しました: java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了しませんでした

この問題を解決するにはどうすればよいですか。ちなみに私はSQL初心者です。

4

3 に答える 3

1

COLLATE Latin1_General_CS_ASオラクルの構文ではなく、SQLサーバーのように見えます

基本的なSQLは次のようになります。

ResultSet rs = statement.executeQuery("SELECT NAMES, AUTHOR, ID FROM BOOKS WHERE upper(NAMES) LIKE upper('%"+word+"%') OR upper(AUTHOR) LIKE upper('%"+word+"%') ");

ただし、これはテーブル全体/インデックス全体のスキャンであるため、高速ではありません。高速な文字列検索のために、Oracle にはoracle textがあります。これらのタイプの無制限の検索を(大きなテーブルで)行う必要がある場合は、それを読んでテキストインデックスを実装することをお勧めします。

于 2012-11-12T21:53:49.180 に答える
0

別のオプションは、セッションを言語文字比較を使用するように切り替えることです。

ALTER SESSION SET nls_comp = Linguistic;
ALTER SESSION SET nls_sort = XGerman_CI;

SELECT NAMES, AUTHOR, ID 
FROM BOOKS 
WHERE NAMES LIKE '%foo%' 
  OR AUTHOR LIKE '%bar%'

これは、言語のルールを考慮に入れるため、値に対して「単に」UPPER を実行するよりも少し高度です (たとえば、ドイツ語でßは、ss

を使用したソリューションと同じようにフル テーブル スキャンを使用しますUPPERが、これ%は検索値の先頭にあるためであり、NLS 設定 (またはupper関数の適用) によるものではありません。両方の式がインデックスでサポートされる可能性があります。PostgreSQL Oracle とは異なります。は、%foo%条件にのみインデックスを使用できませんfoo%

利用可能な NLS_SORT 値のリストについては、こちらを参照してください

言語検索と並べ替えの仕組みに関する詳細な説明については、こちらを参照してください。

于 2012-11-12T22:50:47.643 に答える
-2

必要なもの:

WHERE NAMES COLLATE Latin1_General_CS_AS LIKE'% "+ word +"'%OR AUTHOR COLLATE Latin1_General_CS_AS LIKE'% "+ word +"%'など...

于 2012-11-12T21:53:12.863 に答える