0

我有一个包含用户详细信息的数据库。我没有单独的“名字”和“姓氏”列。我只使用了一个列:“名称”。我的查询是这样的:

ps_details=con.prepareStatement("select * from student_details where name=?");  
ps_details.setString(1,name);

问题是:

在 db 中,名称以大写形式存储。因此,当用户以小写或混合大小写输入他/她的姓名时,搜索不成功。这个问题的有效解决方案是什么?

此外,如果“名称”以小写、混合大小写和大写形式存储在 db 中,即,如果事先不知道大小写,该怎么办。我也想用like子句

我正在使用 Oracle 11g Express 编辑器。

4

3 回答 3

3

如果您真的打算进行完全匹配(即用户需要输入他们的全名才能进行搜索,而不是只输入他们姓名的一部分),您可以将表达式的两侧包装在 theUPPERLOWER函数中.

SELECT *
  FROM student_details
 WHERE upper(name) = upper(?)

但是,如果您这样做,Oracle 将无法使用索引,name因此它必须扫描整个表。这不是特别有效。您可以通过创建基于函数的索引来解决该问题upper(name)

CREATE INDEX idx_upper_name
    ON student_details( upper(name) );

但实际上,我怀疑您不想进行基于通配符的比赛。您几乎肯定希望允许用户输入名称的某些部分并返回包含该字符串的结果。因此,如果我是学生,您可能希望允许用户搜索“Justin”或“Cave”或“Justin Cave”或“Just”,并让所有这些搜索返回我的行(以及任何其他匹配的行,当然)。如果你想这样做,最简单的方法是将LIKE函数与%通配符一起使用

SELECT *
  FROM student_details
 WHERE upper(name) like '%' || upper(?) || '%'

将返回在您正在搜索的文本中的任何位置找到输入字符串的所有行。但这实际上使我们在性能方面回到了几乎一成不变的状态——拥有领先的通配符将使 Oracle 很难从使用我们定义的索引中受益UPPER(name)。这就是为什么大多数人会分开存储名字和姓氏的原因。这允许他们做类似的事情

SELECT *
  FROM student_details
 WHERE upper(first_name) like upper(?) || '%'
    OR upper(last_name) like upper(?) || '%'

无论用户搜索“Justin”、“Cave”还是“Just”,无论数据库中数据的大小写或搜索中输入的数据如何,这都允许他们返回我的行。它能够对数据使用适当的基于函数的索引。

于 2012-06-26T17:06:41.803 回答
2

UPPER - upper 函数将指定字符串中的所有字母转换为大写。在变量(用户输入)和表列值上使用它,将它们都转换为相同的大小写以进行比较以处理这两个问题。(您也可以使用 lower - 想法是将两者转换为相同的情况以进行比较)。*为 LIKE 编辑,仅使用后置通配符 *

select * from student_details where UPPER(name) like UPPER(?) || '%'

这是您必须玩的,但我认为您也可以使用通配符执行以下操作。

ps_details=con.prepareStatement("select * from student_details where UPPER(name) like UPPER(?)");  
ps_details.setString(1,name%);
于 2012-06-26T16:53:16.173 回答
1

尝试在您的输入上使用 UPPER()。

于 2012-06-26T16:52:45.033 回答