Столбец индекса не обязательно должен быть столбцом исходной таблицы; это может быть функция или скалярное выражение, вычисляемое на основе одного или нескольких столбцов таблицы. Данная функциональность полезна для обеспечения быстрого доступа к таблицам на основе результатов вычислений.
Например, распространенным способом выполнения сравнений без учета регистра является использование lower функции:
SELECT * FROM test1 WHERE lower(col1) = 'value';
Данный запрос может использовать индекс, если он был определен для результата lower(col1)
функции:
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
Если бы данный индекс был объявлен как UNIQUE, это предотвратило бы
создание строк, чьи col1 значения различаются только регистром,
а также строки, в которых col1 значения фактически идентичны.
Таким образом, индексы по выражениям могут использоваться для обеспечения ограничений, которые
нельзя определить как простые ограничения уникальности.
Другой пример: если часто выполняются такие запросы, как:
SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';
то имеет смысл создать индекс следующего вида:
CREATE INDEX people_names ON people ((first_name || ' ' || last_name));
Синтаксис CREATE INDEX команды обычно требует
заключать выражения индекса в скобки, как показано во втором
примере. Скобки можно опустить, когда выражение представляет собой просто вызов функции, как в первом примере.
Обслуживание индексов по выражениям обходится относительно дорого, так как производные выражения должны вычисляться при каждой вставке строки и обновлении без использования механизма HOT. Тем не менее выражения индекса
не не вычисляются повторно при поиске по индексу, так как они уже сохранены в нем. В обоих приведенных выше примерах система рассматривает запрос как WHERE indexedcolumn = 'constant'
таким образом, скорость поиска эквивалентна любому другому простому запросу с использованием индекса. Таким образом, индексы по выражениям полезны в тех случаях, когда скорость выборки данных важнее скорости вставки и обновления записей.