如果您真的打算进行完全匹配(即用户需要输入他们的全名才能进行搜索,而不是只输入他们姓名的一部分),您可以将表达式的两侧包装在 theUPPER
或LOWER
函数中.
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”,无论数据库中数据的大小写或搜索中输入的数据如何,这都允许他们返回我的行。它能够对数据使用适当的基于函数的索引。