mantovpinets, Ну, делайте как вам удобнее. Но лично я в подобных ситуациях предпочитаю создавать новый столбец. Представьте, что вы ошиблись в запросе - скопировали не то и не туда. Если данные писались в новый столбец, то проблем нет - исправляем запрос, пишем ещё раз. А если в тот же самый столбец - то данные испорчены.
Проблема не в CASE, а в том, что вы условие в SELECT MAX... испортили, заменив Rates.currency на R.currency - ведь псевдоним R для таблицы Rates уже используется. В результате получается так: R.date должна быть равна максимальной среди тех, где выполнено условие I.currency = R.currency - а оно оказывается в данном случае всегда истинным, поскольку уже присутствует в первой части условия джоина - то есть, берётся просто максимальная дата. А значит, чтобы было что джоинить, I.currency должна соответствовать той, что содержится в Rates в записи с максимальной датой. Поэтому, если последним по дате задаётся курс доллара, то для евро ничего найдено не будет - отсюда и null.
Я вам вообще-то не какую-то "идею" сообщил, а вполне конкретный факт - не работает, потому что вызывается несуществующая функция. О чём ещё тут говорить?