ユーザー入力からjava.lang.Stringオブジェクトを受け取り、JDBC SELECTステートメントを発行する JDBC ライブラリを作成しています。エスケープされていない%文字が存在すると、ライブラリが比較でLIKE句を使用するようになりますが、エスケープされていない%文字のない文字列の場合は、より厳密な=比較を使用する必要があります。
たとえば、次のテーブルとデータを使用します。
CREATE TABLE S (V CHARACTER VARYING);
INSERT INTO S (V) VALUES ('%B%'); -- row a
INSERT INTO S (V) VALUES ('%%%'); -- row b
INSERT INTO S (V) VALUES ('%%X'); -- row c
文字列"\%\%\%"* (エスケープされていない%文字を含まない) が次のクエリにつながるようにします。
SELECT * FROM S WHERE V = '%%%'
... 1 行 (行 b) のみに一致します。一方、文字列"\%%\%" (エスケープされていない%を 1 つ含む) は次のクエリにつながるはずです。
SELECT * FROM S WHERE V LIKE '\%%\%'
... 行 a と b のみに一致します (c には一致しません)。
エスケープされていない%文字に対してそのようなテストを行い、 =比較に必要なエスケープされていないバージョンを生成するユーティリティ クラスが Java にありますか(すべての%文字が最初にエスケープされている場合)。
ロジックは次のようになります。
if ( unescapedPercentageExists( s ) )
likeClause( s )
else
equalClause ( removeEscapes( s ) )