0

我有一个关于 sql 的问题。我使用 jDeveloper 和 oracle sql developer。

我想让搜索大小写不敏感,我这样写:

        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不是 oracle 语法的东西,它看起来像 sql server 的东西

您的基本 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+"%', etc....

于 2012-11-12T21:53:12.863 回答