Есть ли в db2 «величайшая» функция?

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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
0
9 542
6

Ответы 6

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

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

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

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

нам нужна скалярная функция, а не функция столбца ... у нас есть 6 разных столбцов, которые мы хотим найти максимум, а не столбец значений

Mike Stone 24.10.2008 23:08

Вы не указали это в своем первоначальном запросе.

Mike Wills 24.10.2008 23:20

Я думал, что это подразумевается под «функцией, которую можно использовать как: величайший (1, 2, 3, 4), и она вернет 4» и «она работает только при выборе максимума столбца».

Mike Stone 25.10.2008 00:25

Почему МАКС у вас не работает?

выберите max (1,2,8,3,1,7) из sysibm.sysdummy1

дает мне

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

      1 record(s) selected.

Итак, max в db2 является скалярным и агрегатным? интересно.

Mark Brady 24.10.2008 23:13

Странно ... Я получаю "SQL0440N Не было найдено ни одной авторизованной процедуры с именем" MAX "типа" FUNCTION "с совместимыми аргументами. SQLSTATE = 42884", когда я это делаю ....

Mike Stone 25.10.2008 00:16

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

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

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

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

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

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

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

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, вам придется дать ей другое имя.

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

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

Другие вопросы по теме