SQL Server에 .NET의 Math.Max와 같은 두 가지 값을 취하는 Max 함수가 있습니까?


488

다음과 같은 쿼리를 작성하고 싶습니다.

SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o

그러나 이것은 MAX기능이 작동 하는 방식이 아닙니다 . 집계 함수이므로 단일 매개 변수를 예상 한 다음 모든 행의 MAX를 리턴합니다.

누구든지 내 방식대로하는 법을 알고 있습니까?


13
그것은 대부분의 다른 데이터베이스에서 GREATEST함수 로 구현됩니다 . SQLite는 MAX집계 에서 여러 열을 허용하여 지원을 에뮬레이트합니다 .
OMG Ponies


아래 max (a, b)에 대한 해를 구할 때 "a"및 / 또는 "b"에 대한 구문 또는 계산을 반복할지 여부에 대한 질문을 명심하십시오. 즉, "b"가 많은 구문을 포함하는 복잡한 계산에서 파생 된 경우 "b"가 한 번만 나타나는 솔루션을 선호 할 수 있습니다. 예를 들어, "IIF (a> b, a, b)"솔루션은 "b"반복을 의미합니다. – 구문 상으로는 못 생겼지 만 다음 솔루션은 "b"(및 "a")가 한 번만 나타남을 의미합니다. SELECT MAX (VALUE) F1에서 (값으로 선택하십시오. UNION 선택으로 선택하십시오. 값으로) T1
Andrew Jens

답변:


158

User-Defined Function예제와 비슷한 구문을 원한다면 if 를 작성해야 하지만 CASE다른 사람들이 말했듯이 문장을 사용하여 원하는 일을 인라인으로 쉽게 수행 할 수 있습니까 ?

UDF이 같은 수 :

create function dbo.InlineMax(@val1 int, @val2 int)
returns int
as
begin
  if @val1 > @val2
    return @val1
  return isnull(@val2,@val1)
end

... 그리고 당신은 그렇게 그렇게 부를 것입니다 ...

SELECT o.OrderId, dbo.InlineMax(o.NegotiatedPrice, o.SuggestedPrice) 
FROM Order o

24
나는 당신에게 솔루션을 지원할 것입니다. 추가 할 유일한 것은 NULL 값에 대한 지원입니다. 마지막 줄 "return @ value2"를 "return isnull (@ val2, @ val1)"으로 수정하면 값 중 하나가 null이면 함수는 null이 아닌 값을 반환하고 그렇지 않으면 다음과 같이 작동합니다. 정상
kristof September

1
다른 데이터 유형은 어떻습니까? 예를 들어 HigherIntegerArgument와 HigherDateTimeArgument, HigherVarcharArgument 및 ...을 작성해야합니까?
2009 년

9
모든 것이 스칼라 UDF이므로 이것은 매우 느릴 것입니다. 대신 인라인 UDF를 사용하십시오
AK

12
@ xan 나는 실제로 그 질문을 할 때 내 마음에 무슨 일이 있었는지 전혀 모른다. 너무 많지는 않습니다. 어쨌든 대답 주셔서 감사합니다.
토마스

13
@Thomas Obligatory meme 이미지 (어떤 식 으로든 당신을 공격하지 않습니다!) flickr.com/photos/16201371@N00/2375571206
xan

468

SQL Server 2008 이상을 사용하는 경우 이것이 더 나은 솔루션입니다.

SELECT o.OrderId,
       (SELECT MAX(Price)
        FROM (VALUES (o.NegotiatedPrice),(o.SuggestedPrice)) AS AllPrices(Price))
FROM Order o

모든 크레딧과 투표는 관련 질문 인 "여러 열의 SQL MAX?"에 대한 Sven의 답변으로 가야합니다.
" 최고의 답변 " 이라고 말합니다 .

  1. UNION, PIVOT, UNPIVOT, UDF 및 미친 긴 CASE 통계로 코드를 복잡하게 할 필요는 없습니다.
  2. null 처리 문제로 괴롭히지 않고 null을 잘 처리합니다.
  3. "MAX"를 "MIN", "AVG"또는 "SUM"으로 쉽게 바꿀 수 있습니다. 집계 함수를 사용하여 여러 열에서 집계를 찾을 수 있습니다.
  4. 내가 사용한 이름 (예 : "AllPrices"및 "Price")으로 제한되지 않습니다. 다음 사람이 더 쉽게 읽고 이해할 수 있도록 자신의 이름을 선택할 수 있습니다.
  5. 다음 과 같이 SQL Server 2008의 파생 _
    테이블을 사용하여 여러 집계를 찾을 수 있습니다 . SELECT MAX (a), MAX (b) FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) AS MyTable (a, b)

27
절차 / 함수를 생성하기 위해 액세스 할 필요가없는 +1 답변 만!
Alex

6
내가 찾은 대답의 유형입니다. 함수를 사용하는 것이 느리며 날짜에도 작동하므로 이것이 필요합니다.
Johann Strydom 2016 년

3
+1 특히 2 개 이상의 열을 비교할 때 완벽하게 작동합니다!
JanW

11
스칼라 만 계산하면되는 CASE WHEN 솔루션보다 성능이 떨어집니다.
tekumara

5
더 간단한 구문은 최대 2 개의 값을 결정할 때 성능 저하를 일으킬 가치가 없지만 더 많은 값을 가진 다른 문제 일 수 있습니다. 최대 4 개의 값을 얻을 때도 VALUES 절이 단순하고 명확하게 유지되는 동안 CASE 절이 길어지고 수작업으로 생성되면 어색하고 오류가 발생하기 쉽습니다.
Typhlosaurus

221

한 줄로 할 수 있습니다 :

-- the following expression calculates ==> max(@val1, @val2)
SELECT 0.5 * ((@val1 + @val2) + ABS(@val1 - @val2)) 

편집 : 매우 큰 숫자를 다루는 경우 정수 오버플로를 피하기 위해 값 변수를 bigint로 변환해야합니다.


18
+1 당신이 가장 올바른 방법을 제공했다고 생각합니다. "SELECT ((@ val1 + @ val2) + ABS (@ val1- @ val2)) / 2를 MAX_OF_TWO로"또한 "SELECT ((@ val1 + @ val2)-ABS (@ val1- @ val2)) / 2를 MIN_OF_TWO로 기억 ".
tom

6
이 방법은 합계가 int에 저장 될 수있는 것보다 큰 경우 오버 플로우 오류를 발생시킵니다. ABS (@
AakashM

89
이것은 매우 "더러운" "트릭"입니다. 코드를 프로그래밍 할 때 목표를 명시 적으로 표현해야하지만, 난독 화 콘테스트에서 가져온 코드처럼 보입니다.
greenoldman

24
"더러운"것일 수도 있지만 간단한 SQL 방언이있는 데이터베이스의 유일한 옵션 일 수도 있습니다.
splattne

12
나는 marcias에 동의하지 않는다. 주석이 목표를 달성 할 수있는 한, 코드 자체가 반드시 명시 적으로 목표를 표현할 필요는 없습니다. 코드 (또는 어디에서나)에서 복잡한 수학 방정식을 수행하는 경우 때로는 자체 설명하기가 어렵습니다. 그것이 더 단순하고 이해하기 쉬운 부분으로 나뉘어지면 올바른 프로그래밍입니다.
Rob

127

나는 그렇게 생각하지 않습니다. 나는 다른 날 이것을 원했습니다. 내가 얻은 가장 가까운 것은 :

SELECT
  o.OrderId,
  CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice 
     ELSE o.SuggestedPrice
  END
FROM Order o

4
이것은 내가 가장 좋아하는 방법입니다. 오버플로의 위험이 없으며 splattne의 솔루션 (멋진 btw)보다 덜 복잡하며 UDF를 만드는 번거 로움이 없습니다. 많은 상황에서 케이스가 매우 편리합니다.
랜스 피셔

o o 교섭 가격> o. 협상 가격 또는 o. 제안 가격이 NULL 인 경우 o o 협상 가격 ELSE o. 제안 가격 종료 주문 o
mohghaderi

"o.NegotiatedPrice"대신 "(datediff (day, convert (datetime, adr_known_since, 120), getdate ())-5) * 0.3"과 같은 용어가 있으면이 코드를 반복해야합니다. 이 용어의 향후 변경은 두 번 수행해야합니다. min (x, y, ...) 타입 함수가 훨씬 더 좋을 것입니다
Daniel

87

IIF 기능을 사용 하지 않는 이유 (SQL Server 2012 이상 필요)

IIF(a>b, a, b)

그게 다야.

(힌트 : 둘 중 하나가 null 일 때마다 null결과 a>b가 false이므로주의하십시오. b이 경우 결과가됩니다)


7
값 중 하나가 NULL인 경우 결과는 항상 두 번째입니다.
jahu

4
IIF ()는 CASE 문의 구문 설탕입니다. CASE 조건부 값 중 하나가 NULL이면 결과는 두 번째 값 (ELSE)입니다.
xxyzzy

@xxyzzy는 NULL > 1234진술이 거짓 이기 때문에
Xin

8
그래서 IIF(a>b, a, COALESCE(b,a))하나가 존재하는 경우 값을 제공합니다
mpag

32
DECLARE @MAX INT
@MAX = (SELECT MAX(VALUE) 
               FROM (SELECT 1 AS VALUE UNION 
                     SELECT 2 AS VALUE) AS T1)

UDF를 작성할 필요없이 DRY (반복하지 마십시오)를 준수하기 때문에이 솔루션에 +1을 제공합니다. 확인해야 할 두 값이 다른 SQL의 결과 인 경우에도 좋습니다. 예를 들어 필자의 경우 2 개의 select count (*) 문 중 더 큰 것을 찾고 싶습니다.
MikeKulls

1
나는이 솔루션에 의지해야한다는 것을 싫어하지만 GREATEST 또는 인라인 MAX에 대한 기본 지원을 추가 할 때까지 SQL Server에서 수행하는 가장 좋은 방법입니다. 게시 해 주셔서 감사합니다-+1 당신에게!
SqlRyan

10

다른 답변은 좋지만 NULL 값을 걱정 해야하는 경우이 변형을 원할 수 있습니다.

SELECT o.OrderId, 
   CASE WHEN ISNULL(o.NegotiatedPrice, o.SuggestedPrice) > ISNULL(o.SuggestedPrice, o.NegotiatedPrice)
        THEN ISNULL(o.NegotiatedPrice, o.SuggestedPrice)
        ELSE ISNULL(o.SuggestedPrice, o.NegotiatedPrice)
   END
FROM Order o

1
필요한 유일한 ISNULL은 ELSE 이후입니다. 초기 ">"비교는 false를 반환하고 값 중 하나가 이미 null 인 경우 ELSE로 이동합니다.
Phil B

10

SQL Server 2012 이상에서는 IIFand ISNULL(또는 COALESCE) 조합을 사용 하여 최대 2 개의 값을 얻을 수 있습니다.
그중 하나가 NULL 인 경우에도 마찬가지입니다.

IIF(col1 >= col2, col1, ISNULL(col2, col1)) 

또는 둘 다 NULL 일 때 0을 반환하려면

IIF(col1 >= col2, col1, COALESCE(col2, col1, 0)) 

스 니펫 예제 :

-- use table variable for testing purposes
declare @Order table 
(
  OrderId int primary key identity(1,1),
  NegotiatedPrice decimal(10,2),
  SuggestedPrice decimal(10,2)
);

-- Sample data
insert into @Order (NegotiatedPrice, SuggestedPrice) values
(0, 1),
(2, 1),
(3, null),
(null, 4);

-- Query
SELECT 
     o.OrderId, o.NegotiatedPrice, o.SuggestedPrice, 
     IIF(o.NegotiatedPrice >= o.SuggestedPrice, o.NegotiatedPrice, ISNULL(o.SuggestedPrice, o.NegotiatedPrice)) AS MaxPrice
FROM @Order o

결과:

OrderId NegotiatedPrice SuggestedPrice  MaxPrice
1       0,00            1,00            1,00
2       2,00            1,00            2,00
3       3,00            NULL            3,00
4       NULL            4,00            4,00

그러나 여러 값을 합산해야한다면?
그런 다음 CROSS APPLY를 값 집계에 적용하는 것이 좋습니다.
이것은 또한 다른 것들을 동시에 계산할 수 있다는 이점이 있습니다.

예:

SELECT t.*
, ca.[Total]
, ca.[Maximum]
, ca.[Minimum]
, ca.[Average]
FROM SomeTable t
CROSS APPLY (
   SELECT 
    SUM(v.col) AS [Total], 
    MIN(v.col) AS [Minimum], 
    MAX(v.col) AS [Maximum], 
    AVG(v.col) AS [Average]
   FROM (VALUES (t.Col1), (t.Col2), (t.Col3), (t.Col4)) v(col)
) ca

8

하위 쿼리는 외부 쿼리에서 열에 액세스 할 수 있으므로이 방법 을 사용 MAX하여 열 전체와 같은 집계를 사용할 수 있습니다 . (아마도 더 많은 수의 열이 관련된 경우 더 유용합니다)

;WITH [Order] AS
(
SELECT 1 AS OrderId, 100 AS NegotiatedPrice, 110 AS SuggestedPrice UNION ALL
SELECT 2 AS OrderId, 1000 AS NegotiatedPrice, 50 AS SuggestedPrice
)
SELECT
       o.OrderId, 
       (SELECT MAX(price)FROM 
           (SELECT o.NegotiatedPrice AS price 
            UNION ALL SELECT o.SuggestedPrice) d) 
        AS MaxPrice 
FROM  [Order]  o

좋은! 아주 잘 확장됩니다.
greenoldman

2005 년에도 여전히 사랑하는 이들에게 +1을 보여주었습니다. 나는이 대답을 어떻게 간과했는지 모르겠습니다. 표지 아래에서 2 년 후 게시 한 내용과 마찬가지로 성능이 우수하다고 생각합니다. 돌이켜 보면, 나는 이것을 깨달았으며 당시의 최신 2008 구문을 포함하도록 귀하의 답변을 업데이트했습니다. 죄송합니다. 지금 포인트를 알려 드리겠습니다.
MikeTeeVee

@MikeTeeVee-감사합니다! 그렇습니다. 커버 아래에서 계획은 동일합니다. 그러나 VALUES구문이 더 좋습니다.
Martin Smith

6

SQL Server 2012 소개 IIF:

SELECT 
    o.OrderId, 
    IIF( ISNULL( o.NegotiatedPrice, 0 ) > ISNULL( o.SuggestedPrice, 0 ),
         o.NegotiatedPrice, 
         o.SuggestedPrice 
    )
FROM 
    Order o

사용할 때 권장 NULL을 처리 IIF때문에, NULL당신의 양쪽에 boolean_expression의지 원인이 IIF을 반환 false_value(반대 NULL).


귀하의 솔루션은 잘 NULL을 처리하지 않습니다 다른 값이 음수 인 경우,이 null를 돌려줍니다
t-clausen.dk

5

kcrumley가 제공하는 솔루션 을 사용합니다. NULL을 처리하도록 약간 수정하십시오.

create function dbo.HigherArgumentOrNull(@val1 int, @val2 int)
returns int
as
begin
  if @val1 >= @val2
    return @val1
  if @val1 < @val2
    return @val2

 return NULL
end

EDIT Mark의 주석 이후 수정되었습니다 . 3 개의 값이 지정된 논리 x> NULL 또는 x <NULL에서 올바르게 지적했듯이 항상 NULL을 반환해야합니다. 다시 말해 알 수없는 결과입니다.


1
널이 중요합니다. 그리고 일관되게 처리하는 것이 중요합니다. Is NULL> x에 대한 유일한 정답은 NULL입니다.
Mark Brackett

당신이 맞습니다, 나는 그것을 반영하기 위해 내 대답을 수정할 것입니다. 그것을 지적 해 주셔서 감사합니다
kristof

int와 NULL을 전달하면 null이 아닌 값을 반환하는 것이 더 일반적이라고 생각하므로 함수는 Max (x, y)와 ISNULL (x, y)의 조합으로 작동합니다. 따라서 개인적으로 마지막 줄을 다음과 같이 변경합니다. return ISNULL (@ val1, @ val2)-아마 당신이 시작해야 할 것입니다 :)
redcalx

@ the-locster, Mark의 코멘트를 참조하십시오.
Kristof

1
모든 것이 스칼라 UDF이므로 이것은 매우 느릴 것입니다. 대신 인라인 UDF를 사용하십시오
AK

4

이것처럼 간단합니다.

CREATE FUNCTION InlineMax
(
    @p1 sql_variant,
    @p2 sql_variant
)  RETURNS sql_variant
AS
BEGIN
    RETURN CASE 
        WHEN @p1 IS NULL AND @p2 IS NOT NULL THEN @p2 
        WHEN @p2 IS NULL AND @p1 IS NOT NULL THEN @p1
        WHEN @p1 > @p2 THEN @p1
        ELSE @p2 END
END;

이전 답변에 대한 @Nail 의견을 참조하십시오. SELECT dbo.InlineMax (CAST (0.5 AS FLOAT), 100)이 잘못되었습니다.
Luca

4
SELECT o.OrderId,   
--MAX(o.NegotiatedPrice, o.SuggestedPrice)  
(SELECT MAX(v) FROM (VALUES (o.NegotiatedPrice), (o.SuggestedPrice)) AS value(v)) as ChoosenPrice  
FROM Order o

설명은 다음 기사를 참조하십시오 : red-gate.com/simple-talk/sql/sql-training/…
Tom Arleth

2
링크로 코드에 필요한 정보를 포함시키지 마십시오. 이 링크가 언젠가 만료되고 귀하의 답변이 쓸모 없게 될 것이라고 상상해보십시오. 계속해서 답에 직접 essentiell 정보를 추가하십시오. 그러나 다른 사용자가 추가 정보를 찾을 수 있도록 해당 링크를 리소스로 제공 할 수 있습니다.
L. Guthardt

3

죄송합니다. 이 질문에 대한 내용을 게시했습니다 .

대답은 Oracle 's Greatest 와 같은 내장 함수가 없지만 UDF를 사용하여 2 열에 대해 비슷한 결과를 얻을 수 있다는 것입니다. 여기서 sql_variant를 사용하는 것이 매우 중요합니다.

create table #t (a int, b int) 

insert #t
select 1,2 union all 
select 3,4 union all
select 5,2

-- option 1 - A case statement
select case when a > b then a else b end
from #t

-- option 2 - A union statement 
select a from #t where a >= b 
union all 
select b from #t where b > a 

-- option 3 - A udf
create function dbo.GREATEST
( 
    @a as sql_variant,
    @b as sql_variant
)
returns sql_variant
begin   
    declare @max sql_variant 
    if @a is null or @b is null return null
    if @b > @a return @b  
    return @a 
end


select dbo.GREATEST(a,b)
from #t

크리스토프

이 답변을 게시 :

create table #t (id int IDENTITY(1,1), a int, b int)
insert #t
select 1,2 union all
select 3,4 union all
select 5,2

select id, max(val)
from #t
    unpivot (val for col in (a, b)) as unpvt
group by id

1
참고 : GREATEST 함수 구현은 2 개의 매개 변수에 대한 oracle 동작과 일치합니다. 매개 변수가 null이면 null을 반환합니다.
Sam Saffron

2
sql_variant를 사용할 때주의해야합니다. 함수는 다음과 같은 상황에서 예기치 않은 결과를 제공합니다. SELECT dbo.greatest (CAST (0.5 AS FLOAT), 100)
Neil

@ Neil이 옳습니다 (어려운 방법을 배웠습니다). 이런 종류의 문제를 예방하기 위해이 기능을 어떻게 개선 할 것입니까?
Luca

3

다음은 null을 처리하고 이전 버전의 MSSQL에서 작동하는 사례 예입니다. 이것은 널리 사용되는 예제 중 하나의 인라인 함수를 기반으로합니다.

case
  when a >= b then a
  else isnull(b,a)
end

2

이미 언급 한 CASE 구문보다 효율성이 떨어지기 때문에 아마도이 방법을 사용하지 않을 것입니다. 아마도 두 쿼리 모두에 대해 인덱스를 다루지 않았다면. 어느 쪽이든 비슷한 문제에 유용한 기술입니다.

SELECT OrderId, MAX(Price) as Price FROM (
   SELECT o.OrderId, o.NegotiatedPrice as Price FROM Order o
   UNION ALL
   SELECT o.OrderId, o.SuggestedPrice as Price FROM Order o
) as A
GROUP BY OrderId

2

많은 수에 관한 위의 대답에 대해서는 더하기 / 빼기 전에 곱셈을 할 수 있습니다. 약간 부피가 크지 만 캐스트가 필요하지 않습니다. (속도로 말할 수는 없지만 여전히 빠르다고 가정합니다)

선택 0.5 * ((@ val1 + @ val2) + ABS (@ val1-@ val2))

로 변경

@ val1 * 0.5 + @ val2 * 0.5 + ABS (@ val1 * 0.5-@ val2 * 0.5) 선택

캐스팅을 피하려면 적어도 대안입니다.


2

다음은 NULL 처리 기능이있는 IIF 버전입니다 (Xin의 답변을 기반으로 함).

IIF(a IS NULL OR b IS NULL, ISNULL(a,b), IIF(a > b, a, b))

논리는 다음과 같습니다. 값 중 하나가 NULL이면 NULL이 아닌 값을 반환합니다 (둘 다 NULL이면 NULL이 반환 됨). 그렇지 않으면 큰 것을 돌려줍니다.

MIN도 마찬가지입니다.

IIF(a IS NULL OR b IS NULL, ISNULL(a,b), IIF(a < b, a, b))

1

다음과 같이 할 수 있습니다 :

select case when o.NegotiatedPrice > o.SuggestedPrice 
then o.NegotiatedPrice
else o.SuggestedPrice
end

1
SELECT o.OrderID
CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN
 o.NegotiatedPrice
ELSE
 o.SuggestedPrice
END AS Price

1
CREATE FUNCTION [dbo].[fnMax] (@p1 INT, @p2 INT)
RETURNS INT
AS BEGIN

    DECLARE @Result INT

    SET @p2 = COALESCE(@p2, @p1)

    SELECT
        @Result = (
                   SELECT
                    CASE WHEN @p1 > @p2 THEN @p1
                         ELSE @p2
                    END
                  )

    RETURN @Result

END

1

가장 간단한 형태로 ...

CREATE FUNCTION fnGreatestInt (@Int1 int, @Int2 int )
RETURNS int
AS
BEGIN

    IF @Int1 >= ISNULL(@Int2,@Int1)
        RETURN @Int1
    ELSE
        RETURN @Int2

    RETURN NULL --Never Hit

END

1

SQL Server 2012의 경우 :

SELECT 
    o.OrderId, 
    IIF( o.NegotiatedPrice >= o.SuggestedPrice,
         o.NegotiatedPrice, 
         ISNULL(o.SuggestedPrice, o.NegiatedPrice) 
    )
FROM 
    Order o

1

간단한 NULL 처리를 통한 @Scott Langham의 답변은 다음과 같습니다.

SELECT
      o.OrderId,
      CASE WHEN (o.NegotiatedPrice > o.SuggestedPrice OR o.SuggestedPrice IS NULL) 
         THEN o.NegotiatedPrice 
         ELSE o.SuggestedPrice
      END As MaxPrice
FROM Order o

0
select OrderId, (
    select max([Price]) from (
        select NegotiatedPrice [Price]
        union all
        select SuggestedPrice
    ) p
) from [Order]

0
 -- Simple way without "functions" or "IF" or "CASE"
 -- Query to select maximum value
 SELECT o.OrderId
  ,(SELECT MAX(v)
   FROM (VALUES (o.NegotiatedPrice), (o.SuggestedPrice)) AS value(v)) AS MaxValue
  FROM Order o;

VALUES인라인을 흥미롭게 사용하지만 이것이 CASE또는 보다 단순하다는 것을 확신하지 못합니다 IFF.
Chris Schaller

0

Xin의 답변을 확장하고 비교 값 유형이 INT라고 가정하면이 접근법도 효과가 있습니다.

SELECT IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)

이것은 예제 값을 사용한 전체 테스트입니다.

DECLARE @A AS INT
DECLARE @B AS INT

SELECT  @A = 2, @B = 1
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 2

SELECT  @A = 2, @B = 3
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 3

SELECT  @A = 2, @B = NULL
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 2    

SELECT  @A = NULL, @B = 1
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 1

0

MemSQL에서 다음을 수행하십시오.

-- DROP FUNCTION IF EXISTS InlineMax;
DELIMITER //
CREATE FUNCTION InlineMax(val1 INT, val2 INT) RETURNS INT AS
DECLARE
  val3 INT = 0;
BEGIN
 IF val1 > val2 THEN
   RETURN val1;
 ELSE
   RETURN val2;
 END IF; 
END //
DELIMITER ;

SELECT InlineMax(1,2) as test;

-1

Presto에서는 사용할 수 있습니다

SELECT array_max(ARRAY[o.NegotiatedPrice, o.SuggestedPrice])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.