text_pattern_ops を使用してインデックスを作成している場合、PostgreSQLはこれを行います。 演算子、またはC照合を使用している場合。
ランダムな他の照合を使用している場合、PostgreSQLはそれについて何も推測できません。非常に一般的な「en_US.utf8」照合でこれを観察してください。
select * from (values ('03.000221.1'), ('03.0002212'), ('03.000221.3')) f(x) order by x;
x
-------------
03.000221.1
03.0002212
03.000221.3
これは当然、クエリでこの間違った答えにつながります:
select * from (values ('03.000221.1'), ('03.0002212'), ('03.000221.3')) f(id)
where ((id >= '03.000221.'::text) AND (id < '03.000221.Z'::text))
id
-------------
03.000221.1
03.0002212
03.000221.3