Функция в SQL Server 2008 похожа на GREATEST в MySQL?

sql sql-server sql-server-2008

19807 просмотра

5 ответа

Я хочу найти максимальное значение нескольких столбцов.

MySQL поддерживает GREATESTфункцию, а SQL Server - нет.

Есть ли какая-либо функция, аналогичная этой в SQL Server 2008?

Автор: Hset Hset Aung Источник Размещён: 12.11.2019 09:26

Ответы (5)


21 плюса

Нет. Но подзапрос может обращаться к столбцам из внешнего запроса, поэтому вы можете добавить подзапрос, UNION ALLпредставляющий интересующие столбцы, как производную таблицу, а затем выбрать maxиз этого.

SELECT *, 
      (SELECT MAX(c) FROM 
                    (SELECT number AS c 
                     UNION ALL 
                     SELECT status) T) AS GreatestNumberOrStatus
FROM master..spt_values

Или немного более краткая версия, как в 2008 году.

SELECT *, 
      (SELECT MAX(c) FROM (VALUES(number),(status)) T (c)) AS Greatest
FROM master..spt_values
Автор: Martin Smith Размещён: 18.01.2011 03:25

5 плюса

Для этого я создал скалярную функцию следующим образом:

CREATE FUNCTION [dbo].[MaxOrNull](@val1 int, @val2 int)
returns int
as
begin
    if @val1 >= @val2 RETURN @val1
    if @val1 < @val2 RETURN @val2

    RETURN NULL
end

Это наиболее элегантное решение, и его можно использовать в любом месте кода SQL.

Автор: IamIC Размещён: 19.01.2011 03:36

2 плюса

Я бы порекомендовал следующее решение:

SELECT (CASE WHEN t.createdt < t.changedt THEN t.changedt ELSE t.created END) AS ChgDate
  FROM table t
Автор: user4264784 Размещён: 18.11.2014 09:22

2 плюса

Попробуйте использовать TOPвместо или MAX.

Автор: VoodooChild Размещён: 18.01.2011 03:25

1 плюс

Возможное решение:

Create FUNCTION [dbo].[MaxOf]
    (
      @val1 INT =0,
      @val2 INT=0 ,
      @val3 INT =0,
      @val4 INT =0,
      @val5 INT =0,
      @val6 INT =0,
      @val7 INT =0,
      @val8 INT =0,
      @val9 INT =0,
      @val10 INT =0,
      @val11 INT =0,
      @val12 INT =0,
      @val13 INT =0,
      @val14 INT =0,
      @val15 INT =0,
      @val16 INT =0,
      @val17 INT =0,
      @val18 INT =0,
      @val19 INT =0,
      @val20 INT  =0)
      --OUTPUT 
     RETURNS INT  WITH SCHEMABINDING
AS  
   BEGIN
        DECLARE  @MAX AS INT ;
        SET @MAX=0
        IF isnull(@val1,0)> isnull(@MAX,0) SET @MAX=isnull(@val1,0) 
        IF isnull(@val2,0)> isnull(@MAX,0) SET @MAX=isnull(@val2,0) 
        IF isnull(@val3,0)> isnull(@MAX,0) SET @MAX=isnull(@val3,0) 
        IF isnull(@val4,0)> isnull(@MAX,0) SET @MAX=isnull(@val4,0) 
        IF isnull(@val5,0)> isnull(@MAX,0) SET @MAX=isnull(@val5,0) 
        IF isnull(@val6,0)> isnull(@MAX,0) SET @MAX=isnull(@val6,0) 
        IF isnull(@val7,0)> isnull(@MAX,0) SET @MAX=isnull(@val7,0) 
        IF isnull(@val8,0)> isnull(@MAX,0) SET @MAX=isnull(@val8,0) 
        IF isnull(@val9,0)> isnull(@MAX,0) SET @MAX=isnull(@val9,0) 
        IF isnull(@val10,0)> isnull(@MAX,0) SET @MAX=isnull(@val10,0) 
        IF isnull(@val11,0)> isnull(@MAX,0) SET @MAX=isnull(@val11,0) 
        IF isnull(@val12,0)> isnull(@MAX,0) SET @MAX=isnull(@val12,0) 
        IF isnull(@val13,0)> isnull(@MAX,0) SET @MAX=isnull(@val13,0) 
        IF isnull(@val14,0)> isnull(@MAX,0) SET @MAX=isnull(@val14,0) 
        IF isnull(@val15,0)> isnull(@MAX,0) SET @MAX=isnull(@val15,0) 
        IF isnull(@val16,0)> isnull(@MAX,0) SET @MAX=isnull(@val16,0) 
        IF isnull(@val17,0)> isnull(@MAX,0) SET @MAX=isnull(@val17,0) 
        IF isnull(@val18,0)> isnull(@MAX,0) SET @MAX=isnull(@val18,0) 
        IF isnull(@val19,0)> isnull(@MAX,0) SET @MAX=isnull(@val19,0) 
        IF isnull(@val20,0)> isnull(@MAX,0) SET @MAX=isnull(@val20,0) 

        RETURN @MAX ;
    END

и звонок будет

SELECT dbo.MaxOf (2,3,4,0,0,0,0,200,8,0,0,0,0,0,0,0,0,0,0,0)
Автор: Luca Размещён: 17.11.2015 05:18
Вопросы из категории :
32x32