Postgresql

AnaStas

Well-known member
16.09.2008
52
0
#1
База данных PostgreSQL содержит некую таблицу table с колонками ctime, mtime, utime.
Запрос SELECT, формируя строку, должен взять максимальное значение даты из этих трех колонок, т.е. нечто вроде функции max(ctime, mtime, utime). Что-то подобное должно быть, но ни ActivePerl User Guide, ни агрегатные функции SQL не дают ответа на решение этой проблемы.
Perl-код упрощенно такой:
Код:
$mds=$dbh->selectall_arrayref("SELECT id,param1,param2,param3,max(ctime,mtime,utime),param4
FROM table ORDER BY id") or die $dbh->errstr;
. . . . . .
Реакция системы такова:
ERROR: функция max(timestamp without time zone, timestamp without time zone, timestamp without time zone) не существует

Прошу у специалистов консультацию.
 

AnaStas

Well-known member
16.09.2008
52
0
#3
Спасибо за помощь!
Все работает. Для тех, у кого возникнет аналогичный вопрос привожу форму Perl-запроса:
Код:
. . . . . . 
$mds=$dbh->selectall_arrayref("SELECT id,param1,param2,param3,CASE WHEN (ctime<=mtime) AND (mtime<=utime) THEN utime WHEN ctime<=mtime THEN mtime ELSE ctime END AS maxdat,param4
FROM table ORDER BY maxdat") or die $dbh->errstr;
. . . . . .
Читабельность, конечно, не очень "приятно" выглядит, но весь этот CASE можно представить в виде функции типа MAX_3(ctime,mtime,utime) с return максимального значения.
Что же касается GREATEST(value [, ...]) и LEAST(value [, ...]), т.е. максимального и минимального значений из списка, у меня не сработало. А жаль - замечательные функции.
Тема закрыта.


P.S.
Прошу извинить за допущенную мною глупость - для выделения в приведенном коде вставлен "bold". Его не следует применять! Ибо это КОД, а не текст. Будте внимательны при использовании этого момента.