Сегодня обнаружил в коде функцию Coalesce. Ни разу не пользовался. Дословно – объединять. Почему объединять ума не приложу. Функция возвращает первое not null значение из списка, заменитель вложенных NVL функций. И теперь вместо:
NVL(NVL(NVL(ColumnA, ColumnB) , ColumnC), ColumnD)
можно написать:
COALESCE(ColumnA, ColumnB, ColumnC, ColumnD)
Функция «горизонтальная». « Горизонтальная» функция, потому что оперирует колонками (или n параметрами, и количество их конечно, к сожалению, и всегда должно быть задано), а не записями.
Max функция – «вертикальная», потому что оперирует со записями – берет максимально возможное значения поля из n-записей.
Аналог Max функции в «горизонтальном» исполнении Greatest, для Min функции – функция Least, а для Avg нет аналогичной функции. Почему? Редко используется?
Для Coalesce нет аналога «вертикальной» функции, впрочем, аналог был бы бессмысленным.
Вообще Oracle после функции DECODE могли все эти «горизонтальные» функции и не создавать. Она настолько универсальная.
GREATEST реализовывался «простой» конструкцией (для трех полей попробуйте написать сами – получится очень удобная и читаемая конструкция):
DECODE(Sign(ColumnA-ColumnB), 1, ColumnA, -1, ColumnB, ColumnA)
Больше built-in функций – меньше кода, читаемость лучше, да и понятливость тоже.