Вот два способа обойти проблему NULL GREATEST (т. Е. Проблема, с которой GREATEST не только возвращает NULL, когда все значения имеют значение NULL, но уже, когда хотя бы одно значение имеет значение NULL, что делает работу с GREATEST часто неприятной).
Для n столбцов вы можете использовать выражения n COALESCE. Каждое выражение должно содержать все столбцы, каждый из которых начинается с другого столбца.
select
max(
greatest(
coalesce(col1,col2,col3,col4),
coalesce(col2,col3,col4,col1),
coalesce(col3,col4,col1,col2),
coalesce(col4,col1,col2,col3)
)
)
from mytable;
Альтернативой является не использование GREATEST вообще, а сравнение с CASE и COALESCE. Каждое значение сравнивается со всеми другими значениями. col1 >= coalesce(col2,col1)
гарантирует, что col1 считается большим или равным эксфону, когда col2 равен NULL, если сам col1 не является NULL. В CASE все столбцы имеют значение NULL, значение CASE по умолчанию равно NULL. (Можно было бы добавить else NULL
сделать это видимым для неопытный читателя.)
select
max(
case
when col1 >= coalesce(col2,col1) and col1 >= coalesce(col3,col1) and col1 >= coalesce(col4,col1) then col1
when col2 >= coalesce(col1,col2) and col1 >= coalesce(col3,col2) and col1 >= coalesce(col4,col2) then col2
when col3 >= coalesce(col1,col3) and col1 >= coalesce(col2,col3) and col1 >= coalesce(col4,col3) then col3
when col4 >= coalesce(col1,col4) and col1 >= coalesce(col2,col4) and col1 >= coalesce(col3,col4) then col4
end
)
from mytable;
Так что вы хотите, наибольшее значение всех тридцати значений? Или вы хотите получить наибольшее значение за столбец (всего три значения)? –