Есть ли «самая большая» функция в db2? - PullRequest
3 голосов
/ 24 октября 2008

Я обнаружил в MYSQL и, по-видимому, в других движках баз данных, что есть «величайшая» функция, которую можно использовать, например: great (1, 2, 3, 4), и она возвращает 4. Мне это нужно, но я используя IBM DB2. Кто-нибудь знает о такой эквивалентной функции, даже если она принимает только 2 параметра?

Я нашел где-то, что MAX должен это делать, но он не работает ... он работает только при выборе MAX для столбца.

Если такой функции нет, кто-нибудь знает, как может выглядеть хранимая процедура для этого? (У меня нет опыта работы с хранимыми процедурами, поэтому я понятия не имею, на что способна DB2).

Ответы [ 6 ]

4 голосов
/ 29 октября 2008

Как указывает Дейв, MAX должен работать, поскольку он перегружен как скаляр и функция столбца (скаляр принимает 2 или более аргументов). Это относится к DB2 для LUW, DB2 для z / OS и DB2 для i5 / OS. Какую точную версию и платформу DB2 вы используете, и какое заявление вы используете? Одним из требований скалярной версии MAX является то, что все аргументы «совместимы» - я подозреваю, что может быть небольшая разница в типах в одном или нескольких аргументах, передаваемых функции.

4 голосов
/ 24 октября 2008

Почему MAX не работает для вас?

выберите максимум (1,2,8,3,1,7) из sysibm.sysdummy1

дает мне

    1
    ---------------
                 8

      1 record(s) selected.
2 голосов
/ 31 декабря 2008

В Linux V9.1 "select max (1,2,3) ..." дает -

SQL0440N Нет авторизованной подпрограммы с именем "MAX" типа "FUNCTION", имеющей совместимые аргументы были найдены. SQLSTATE = 42884

Это скалярная функция, для которой требуется либо одно значение, либо имя одного столбца. В z / os ведет себя по-разному.

Однако в Linux 9.5 он работает как положено.

1 голос
/ 11 марта 2009

Звучит странно, но в DB2 такой функции не существует, по крайней мере, в версии 9.1. Если вы хотите выбрать больший из двух столбцов, лучше всего использовать выражение регистра.

Вы также можете определить свою собственную функцию max. Например:

create function importgenius.max2(x double, y double)
returns double
language sql
contains sql
deterministic
no external action
begin atomic
    if y is null or x >= y then return x;
    else return y;
    end if;
end

Определение входов и выходов как двойников позволяет вам использовать продвижение типов, поэтому эта функция также будет работать для целых чисел. Операторы «детерминистический» и «без внешнего действия» помогают ядру базы данных оптимизировать использование функции.

Если вы хотите, чтобы другая функция max работала для ввода символов, вам придется дать ей другое имя.

1 голос
/ 24 октября 2008

Два варианта:

  1. А как насчет сортировки столбца по убыванию и захвату верхней 1 строки?

  2. Согласно моему «SQL Pocket Guide», MAX (x) возвращает наибольшее значение в наборе.

ОБНОВЛЕНИЕ: Очевидно, # 1 не будет работать, если вы смотрите на столбцы.

0 голосов
/ 07 февраля 2018

Пожалуйста, проверьте следующий запрос:

select * from table1 a,
(select appno as sub_appno,max(sno) as sub_maxsno from table1 group by appno) as tab2
where a.appno =tab2.sub_appno and a.sno=tab2.sub_maxsno
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...