понедельник, 10 декабря 2012 г.

Создаем свою функцию GREATEST/LEAST для MS SQL Server

    В некоторых процедурных расширениях языка SQL уже есть готовые функции GREATEST/LEAST, например PL/SQL, для вычисления максимального/минимального значения, причем входные параметры это набор значений, перечисленных через запятую (не путать с функцией MAX/MIN с единственным входным параметром - столбцом). К сожалению T-SQL не входит в число таких процедурных расширений. Однако не все так плохо как кажется на первый взгляд. Как говорится выход есть всегда. Итак, пусть у нас есть некая таблица с тремя полями
типа integer и в ней содержаться некоторые данные:

  1. select *
  2. into #table
  3. from
  4. (
  5.   select 1 as col1,2 as col2,3 as col3 union all
  6.   select 3,5,4 union all
  7.   select 7,0,1 union all
  8.   select 1,2,3 union all
  9.   select 3,2,5 union all
  10.   select 1,5,7
  11. ) t
* This source code was highlighted with Source Code Highlighter.

Пусть теперь нам необходимо вывести максимальное значение по имеющимся полям для каждой строки, т.е. результат должен быть следующим:


А вот собственно и код, с помощью которого мы получим такой результат:

  1. select
  2.   col1
  3.   ,col2
  4.   ,col3
  5.   ,(select max(NewColumn) from (values (col1),(col2),(col3)) NewTable(NewColumn)) as maximum
  6. from #table
* This source code was highlighted with Source Code Highlighter.

При вычислении максимума мы использовали табличный конструктор, получив на выходе таблицу NewTable. В скобках после названия таблицы мы должны указать название столбцов, в данном примере у нас один - NewColumn, со значениями указанными после ключевого слова values.

Данный подход работает начиная с версии MS SQL Server 2008. Для более ранних версий можно использовать CASE (при работе с небольшим количеством столбцов) или конструкцию с UNION. Также кроме функции MAX можно использовать и другие агрегатные функции.

Комментариев нет:

Отправить комментарий