Итак, у меня есть строка в таблице. Эта строка имеет восемь полей типа даты.
Я пытаюсь написать запрос, который возвращает наивысшее значение даты из строки.
Например:
NULL,NULL,2009-10-09,2010-03-12,2010-04-15,2010-06-23,2010-08-27,NULL
Запрос при выполнении против указанной выше таблицы возвращает следующее значение для этой строки: 2010-08-27
Я пробовал пару комбинаций с использованием CASE, но кажется неэлегантным и длинным (и поэтому я еще не закончил писать запрос).
Есть ли другие варианты, доступные мне? Или у кого-то есть решение, которое они успешно выполнили?
Оцените любую помощь, которая может быть предложена.:)
Вам нужна функция GREATEST:
SELECT GREATEST(col1, col2, col3, col4, col5, col6, col7, col8) AS max_date
FROM YOUR_TABLE
Обратите внимание на типы данных. Не хотите сравнивать строки, которые должны быть DATEs/etc.
Жаль, что SQL Server этого не имеет, но, к счастью, Oracle и PostgreSQL делают.
Жаль, что SQL Server этого не имеет, но, к счастью, Oracle и PostgreSQL делают.
Но SQL Server допускает другие вещи, такие как выбор без таблицы (нет бизнеса "FROM DUAL", MySQL тоже поддерживает это), а также подзапросы, которые ссылаются на таблицу 2, как на запрос ниже
select a,b,c,d,
(
select max(a)
from
(select a union all
select b union all
select c union all
select d) columnstorows
) greatest
from (select 1 as a,2 as b,null as c,4 as d) virtualtable
Нет ISNULL бизнеса, просто макс.
Как упоминал OMG Ponies, MySQL GREATEST требует IFNULL вокруг каждого столбца. Но даже это не весь ответ. Если вы используете IFNULL и предоставляете "виртуальный минимум" для каждого, вы можете получить неправильный ответ, когда все значения равны нулю. Вы должны IFNULL их в другой столбец, либо поверните их, либо просто любой другой столбец действительно сделает.
select
a,b,c,d,
greatest(ifnull(a,b), ifnull(b,c), ifnull(c,d), ifnull(d,a))
from (select 1 as a,2 as b,null as c,4 as d) virtualtable