Для проверки одной строки мы могли бы использовать функцию GREATEST
для возврата наибольшего значения. Демонстрация с литералами:
SELECT GREATEST( 2 , 3 , 42 , 5 , 7 ) AS highest_val
Мы можем использовать имена столбцов (или другие выражения) вместо литералов; если какое-либо из выражений равно NULL, функция вернет NULL.
Но это только оценивает значение , но не говорит нам, какое выражение в списке предоставило это значение. Мы можем найти в списке выражений соответствующее значение и вернуть позицию в списке. (Если несколько выражений имеют одинаковое наибольшее значение, возвращается позиция первого встреченного, например,
SELECT FIELD( GREATEST( 2 , 3 , 42 , 42 , 7 ), 2 , 3 , 42 , 42 , 7 ) AS which_is_highest
. Мы можем перевести эту позицию в строку, используя функцию ELT
. Например:
SELECT ELT(3, 'first', 'second', 'third', 'fourth' )
Собираем все это вместе ...
Для краткости, давайте предположим, что нам нужно оценить шесть столбцов r1, r2, r3, r4, r5 и r6. также предположим, что столбцы не могут (или не будут) когда-либо содержать значения NULL.
Чтобы получить одно наибольшее значение из шести столбцов:
SELECT ...
, GREATEST(t.r1,t.r2,t.r3,t.r4,t.r5,t.r6) AS highest_val
FROM t
ORDER BY ...
Чтобы получить имя столбец, вернувший наибольшее значение:
SELECT ...
, ELT(
FIELD(
GREATEST(t.r1,t.r2,t.r3,t.r4,t.r5,t.r6)
,t.r1,t.r2,t.r3,t.r4,t.r5,t.r6)
,'r1','r2','r3','r4','r5','r6') AS col_with_highest_val
, ...
FROM t