Я не знаю, будет ли это работать в DB2, но я расскажу вам, как бы я это делал в SQL Server. Я думаю, способ, которым MSSQL делает это, является стандартом ANSI, хотя конкретные строки сортировки могут отличаться. В любом случае, если вы можете сделать это, не удаляя остальную часть вашего приложения - есть ли другие места, где столбец «name» должен быть чувствительным к регистру? - попробуйте сделать весь столбец без учета регистра, изменив параметры сортировки, а затем индексируйте столбец.
ALTER TABLE city ALTER COLUMN name nvarchar(200)
COLLATE SQL_Latin1_General_CP1_CI_AS
... где "nvarchar (200)" обозначает любой тип данных вашего текущего столбца. Часть "CI" строки сопоставления - это то, что помечает ее как нечувствительную к регистру в MSSQL.
Чтобы объяснить ... я понимаю, что индекс будет хранить значения в порядке сортировки индексированного столбца. Если сделать сопоставление столбца нечувствительным к регистру, то все хранилища индексов получат Сан-Франциско, Сан-Франциско и Сан-Франциско. Тогда вам просто нужно удалить «UPPER ()» из вашего запроса, и DB2 должна знать, что он может использовать ваш индекс.
Опять же, это основано исключительно на том, что я знаю о SQL Server, плюс пару минут на изучение спецификации SQL-92; это может или не может работать для DB2.