Но будет 2 вычисления MD5
Выражения в select вычисляются после того, как отобраны строки по условиям в where.
Если выходная выборка совсем небольшая, то оптимизировать работу функции в колонках не нужно - это экономия на спичках.
Другое дело, если вы используете вычисляемую функцию в where. Чтобы она быстро работала есть 3 пути:
1. Если функция вычисляется из данных, которые не зависят от контекста запроса, то нужно отказаться от этой функции, которая вычисляется при каждом запросе. Нужно хранить ее результат в отдельном атрибуте.
2. Сделать индекс с использованием этой функции на атрибуте, тогда при использовании этой же функции в where сработает индекс.
3. Если есть возможность, то нужно так преобразовать выражение where, чтобы все аргументы вычисляемой функции или выражения (складываем, вычитаем, умножаем делим, case-им) оказались входными параметрами или константами. Чтобы такое произошло, нужна обратная функция для md5 - reverse_md5. Но такой функции по математическим соображениям не существует.
Иначе выражение бы выглядело так:
where value = reverse_md5(:hache)