Средне арифметическое двух default null

Задача.

Посчитать средне арифметическое значение двух полей в кортеже, при том, что любое из них может быть null. Проблема в том, что если одно из них null, то делить на 2 уже не нужно. Средне арифметическое должно быть равно второму значению. И наоборот. При этом не хочется городить if-else`ов, и нельзя никак использовать avg(), потому, что она агрегатная.

Решение.

Сложим поле само с собой, если второе null, и всегда разделим на 2:

(coalesce(field1, field2, 0) + coalesce(field2, field1, 0)) / 2 as average_value

Усложним задачу. Если одно из полей вычисляется из двух и более других? Не хочется 2 раза вычислять одно и то-же.

Решение.

Используем присвоение в переменную на лету.

(coalesce(@value1 := field11 / field12 * feild13, field2, 0) + coalesce(field2, @value1, 0)) / 2 as average_value

Ну а если оба значения должны быть вычислены, и любое из них может оказаться null, то посчитаем их сначала, положив в переменные, а потом вычислим средне арифметическое:

@value1 := field11 / field12 * feild13 as value1,
 @value1 := field21 / field22 * feild23 as value2,
 (coalesce(@value1, @value2, 0) + coalesce(@value2, @value1, 0)) / 2 as average_value

Алиасы не обязательны, приведены тут для наглядности, но ссылаться на них мы не можем, т.к. они все находятся в пределах одного вычисляемого select`а.