本当に完全一致を行う場合 (つまり、ユーザーが名前の一部だけを入力するのではなく、検索を行うために名前全体を入力する必要がある場合)、式の両側をUPPER
または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」を検索しても、データベース内のデータの大文字と小文字または検索に入力されたデータに関係なく、行を返すことができます。また、データに対して適切な関数ベースのインデックスを使用できます。