SQL Server'da .NET'te Math.Max ​​gibi iki değer alan bir Max işlevi var mı?


488

Ben böyle bir sorgu yazmak istiyorum:

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

Fakat MAXfonksiyon bu şekilde çalışmaz , değil mi? Birleştirilmiş bir işlevdir, bu nedenle tek bir parametre bekler ve sonra tüm satırların MAX değerini döndürür.

Bunu nasıl yapacağımı bilen var mı?


13
Bu, diğer birçok veritabanında GREATESTişlev olarak uygulanır; SQLite, MAXtoplamda birden çok sütuna izin vererek desteği taklit eder .
OMG Ponies


Aşağıdaki max (a, b) için bir çözüm bulduğunuzda, "a" ve / veya "b" için sözdiziminin veya hesaplamanın tekrarlanmasını isteyip istemediğinizi aklınızda bulundurun. Yani "b", çok sayıda sözdizimi içeren karmaşık bir hesaplamadan türetilmişse, "b" nin yalnızca bir kez göründüğü bir çözümü tercih edebilirsiniz. Örneğin, "IIF (a> b, a, b)" çözeltisi "b" nin tekrarlanması anlamına gelir - sözdizimsel olarak çirkin olabilir, ancak aşağıdaki çözüm "b" (ve "a") yalnızca bir kez görünür demektir: MAX SELECT (VALUE) BAŞLANGIÇ (DEĞER OLARAK SEÇİN B DEĞERİ SEÇİN) DEĞER T1
Andrew Jens

Yanıtlar:


158

User-Defined FunctionÖrneğinize benzer bir sözdizimine sahip olmak istiyorsanız bir yapmanız gerekir , ancak yapmak istediğiniz şeyi bir satırda, birCASE diğerleri söylediler, deyimi.

Bunun UDFgibi bir şey olabilir:

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

... ve öyle diyeceksin ...

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

24
Size çözümü destekleyeceğim, ekleyeceğim tek şey NULL değerler desteğidir. Son satırı değiştirirseniz: "return @ value2" şu şekilde okunur: "return isnull (@ val2, @ val1)", değerlerden biri boşsa işlev null olmayan değeri döndürür, aksi takdirde şu şekilde çalışır: normal
kristof

1
Diğer veri türleri hakkında ne örneğin bir HigherIntegerArgument ve bir HigherDateTimeArgument ve bir HigherVarcharArgument ve bir ... yazmak gerekir?
birgün10

9
her şey skaler UDF'ler gibi bu inanılmaz derecede yavaş olacaktır. Bunun yerine satır içi UDF'leri kullanın
AK

12
@xan Bu soruyu sorduğumda aklımdan geçenlerin hiçbir fikri yok. Çok fazla değil, belli ki. Yine de cevap için teşekkürler.
Thomas

13
@Thomas Zorunlu meme resmi (herhangi bir şekilde size yönelik bir suç yok!) Flickr.com/photos/16201371@N00/2375571206
xan

468

SQL Server 2008 (veya üstü) kullanıyorsanız, bu daha iyi bir çözümdür:

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

Tüm kredi ve oylar, Sven'in "Birden fazla sütunun SQL MAX?" Sorusuna verdiği cevaba gitmelidir.
" En iyi cevap " diyorum çünkü:

  1. Kodunuzu UNION'lar, PIVOT'lar, UNPIVOT'lar, UDF'ler ve çılgınca uzun CASE ifadeleriyle karmaşıklaştırmanız gerekmez.
  2. Null'ları ele alma sorunu ile uğraşmaz, onları iyi işler.
  3. "MAX" ile "MIN", "AVG" veya "SUM" arasında geçiş yapmak kolaydır. Bir çok farklı sütun üzerindeki toplamı bulmak için herhangi bir toplama işlevini kullanabilirsiniz.
  4. Kullandığım isimlerle sınırlı değilsiniz (örn. "AllPrices" ve "Fiyat"). Bir sonraki adam için okumayı ve anlamayı kolaylaştırmak için kendi adlarınızı seçebilirsiniz.
  5. SQL Server 2008'in türetilmiş tablolarını kullanarak birden çok toplama bulabilirsiniz :
    SELECT MAX (a), MAX (b) FROM (DEĞERLER (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) ASTable'ınız (a, b)

27
Sadece +1 + prosedür / fonksiyon oluşturmak için erişim gerektirmeyen cevap!
Alex

6
Tam olarak aradığım cevap türü. İşlevleri kullanmak yavaştır ve bu da tarihlerde çalışacaktır, bu da ihtiyacım olan şey.
Johann Strydom

3
+1 Mükemmel çalışıyor, özellikle 2'den fazla sütun karşılaştırılacak!
JanW

11
Bu sadece bir skaler hesaplaması gereken CASE WHEN çözeltisinden daha az performans gösterir.
tekumara

5
Daha basit sözdizimi, MAX değerlerinin 2'sini belirlerken asla isabet edilen performans değerine değmeyecek olsa da, daha fazla değer içeren farklı bir konu olabilir. MAX değerinin 4 değerini elde ederken bile, CASE yan tümceleri basit, açık ve net kalırken elle üretilirse uzun, beceriksiz ve hataya açık hale gelir.
Typhlosaurus

221

Tek satırda yapılabilir:

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

Düzenle: Çok büyük sayılarla uğraşıyorsanız, tamsayı taşmasını önlemek için değer değişkenlerini bigint'e dönüştürmeniz gerekir.


18
+1 En doğru yolu sağladığınıza inanıyorum. "SELECT ((@ val1 + @ val2) + ABS (@ val1- @ val2)) / 2 olarak MAX_OF_TWO" Ayrıca unutmayın, "SELECT ((@ val1 + @ val2) - ABS (@ val1- @ val2)) / 2 olarak MIN_OF_TWO ".
tom

6
Bu şekilde, toplam bir int'de saklanabilecek değerden büyükse taşma hatası verir: declare @ val1 int declare @ val2 int set @ val1 = 1500000000 set @ val2 = 1500000000 SELECT 0.5 * ((@ val1 + @ val2) + ABS (@ val1 - @ val2)) - => taşma hatası
AakashM

89
Bu son derece "kirli" "hile" dir. Kodunuzu programlarken amacı açıkça ifade etmelidir, ancak sizin durumunuzda gizlilik yarışmasından alınan kod gibi görünmektedir.
greenoldman

24
"Kirli" olabilir, ancak basit SQL lehçelerine sahip veritabanları için tek seçenek olabilir.
splattne

12
Markalara katılmıyorum. Yorumların bir kişinin çalışmasına izin verdiği müddetçe, kodun mutlaka amacı açıkça ifade etmesi gerekmez. Kodda (veya herhangi bir yerde) herhangi bir karmaşık matematik denklemi yapıyorsanız, bazen kendini tanımlayıcı hale getirmek zordur. Sürece daha basit, daha kolay anlaşılır parçaları anlamak o zaman doğru programlama.
Rob

127

Ben öyle düşünmüyorum. Geçen gün bunu istedim. Aldığım en yakın şey:

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

4
Bu benim en sevdiğim yöntem. Bir taşma riski yoktur ve splattne'nin çözümünden daha az şifreli (ki bu harika bir btw) ve bir UDF oluşturma zorluğum yok. Durum birçok durumda çok kullanışlıdır.
Lance Fisher

SEÇ o.OrderId, o.NegotiatedPrice> o.SuggestedPrice VEYA o.SuggestedPrice BOŞ o Sipariş GELEN o.NegotiatedPrice BAŞKA o.SuggestedPrice SONU SONRA IS VAKA
mohghaderi

"O.NegotiatedPrice" yerine "(dateiff (day, convert (datetime, adr_known_since, 120), getdate ()) - 5) * 0.3" gibi bir terim olduğunda bu kodu tekrarlamanız gerekir. Terimde gelecekte yapılacak herhangi bir değişiklik iki kez yapılmalıdır. Min (x, y, ...) tipi bir fonksiyon çok daha hoş olurdu
Daniel

87

Neden IIF işlevini denemiyorsunuz (SQL Server 2012 ve üstü gerekir)

IIF(a>b, a, b)

Bu kadar.

(İpucu: her ikisine de dikkat edin null, çünkü a>bher ikisi de null olduğunda yanlış bolur. Bu durumda sonuç olacaktır)


7
Değerlerden biri ise NULL, sonuç her zaman ikincisidir.
jahu

4
IIF (), CASE ifadesi için sözdizimsel şekerdir. CASE koşullu değerlerinden herhangi biri NULL ise, sonuç ikincisidir (ELSE).
xxyzzy

@xxyzzy çünkü NULL > 1234ifade yanlıştır
Xin

8
yani IIF(a>b, a, COALESCE(b,a))sadece bir tane olduğunda değer vermek için
mpag

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

Bu çözümü +1 olarak veriyorum çünkü UDF yazmaya gerek kalmadan DRY (kendinizi tekrar etmeyin) ile uyumlu. Kontrol etmeniz gereken her iki değer de diğer sql'nin sonuçlarıysa harika, örneğin benim durumumda 2 select count (*) ifadesinden daha fazlasını bulmak istiyorum.
MikeKulls

1
Bu çözüm başvurmak zorunda nefret ediyorum, ama onlar BÜYÜK veya satır içi MAX için yerel destek eklemek kadar SQL Server'da bunu yapmak için en iyi yoldur. Gönderdiğiniz için teşekkür ederiz - size +1!
SqlRyan

10

Diğer cevaplar iyidir, ancak NULL değerlere sahip olmak konusunda endişelenmeniz gerekiyorsa, bu varyantı isteyebilirsiniz:

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
Gereken tek ISNULL, ELSE'den sonradır. İlk ">" karşılaştırması false değerini döndürür ve değerlerden herhangi biri zaten boşsa ELSE öğesine gider.
Phil B

10

SQL Server 2012 veya sonraki sürümlerde, en fazla 2 değeri elde etmek için IIFve ISNULL(veya COALESCE) birleşimlerini kullanabilirsiniz .
1 tanesi NULL olsa bile.

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

Veya her ikisi de NULL olduğunda 0 döndürmesini istiyorsanız

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

Örnek pasaj:

-- 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

Sonuç:

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

Ama eğer birden fazla değeri TOPLAMALARI gerekiyorsa?
Daha sonra DEĞERLERİN bir araya gelmesi için ÇAPRAZ UYGULAMASI öneririm.
Bu aynı zamanda diğer şeyleri aynı anda hesaplayabilmesi avantajına da sahiptir.

Misal:

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

Alt Sorgular, Dış sorgudan sütunlara erişebilir, böylece bu yaklaşımıMAX sütunlar arası gibi toplamalar kullanmak için kullanabilirsiniz . (Bununla birlikte, daha fazla sayıda sütun olduğunda muhtemelen daha yararlıdır)

;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

Güzel! Çok iyi ölçekleniyor.
greenoldman

Hala 2005'te olanlar için Sevgi göstermek için +1. Bu cevabı nasıl gözden kaçırdığımı bilmiyorum. Kapakların altında, 2 yıl sonra yayınladığım kadar iyi performans gösterdiğini hayal ediyorum. Geriye dönüp baktığımda, bunu fark etmiş ve cevabınızı o zaman daha yeni 2008 sözdizimini içerecek şekilde güncellemeliydim. Üzgünüm, şimdi puanlarımı sizinle paylaşabilseydim.
MikeTeeVee

@MikeTeeVee - Teşekkürler! Evet kapakların altında plan aynı olacak. Ancak VALUESsözdizimi daha güzel.
Martin Smith

6

SQL Server 2012 tanıtıldı IIF:

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

Kullanırken NULL'ların kullanılması önerilir IIF , çünkü NULLher iki tarafınızdaki a , (aksine ) döndürmeye boolean_expressionneden olur .IIFfalse_valueNULL


Diğer değer negatif olduğunda çözümünüz NULL ile iyi işlemez, bu null döndürür
t-clausen.dk

5

Ben kcrumley tarafından sağlanan çözüm ile gitmek istiyorum Sadece NULLs işlemek için biraz değiştirin

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'ın yorumundan sonra değiştirildi . 3 değerli mantıkta doğru bir şekilde işaret ettiği gibi x> NULL veya x <NULL her zaman NULL döndürmelidir. Başka bir deyişle bilinmeyen sonuç.


1
Sıfırlar önemlidir. Ve onları tutarlı bir şekilde ele almak önemlidir. Is NULL> x için tek uygun yanıt NULL.
Mark Brackett

Haklısın, cevabımı yansıtacak şekilde değiştireceğim, bunu işaret ettiğiniz için teşekkürler
kristof

Bir int ve NULL geçirirsek, null olmayan değerin döndürülmesini istemek daha yaygındır, bu nedenle işlev Max (x, y) ve ISNULL (x, y) birleşimi olarak işlev görür. Bu yüzden şahsen son satırı şu şekilde değiştirirdim: dönüş ISNULL (@ val1, @ val2) - kuşkusuz muhtemelen başlamak istediğiniz şey :)
redcalx

@ the-locster, Mark'ın yorumuna bakın
kristof

1
her şey skaler UDF'ler gibi bu inanılmaz derecede yavaş olacaktır. Bunun yerine satır içi UDF'leri kullanın
AK

4

Bu kadar basit:

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;

@Bir önceki cevaba yapılan @Neil yorumu SELECT dbo.InlineMax (CAST (0.5 AS FLOAT), 100) yanlış.
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

Açıklama için lütfen bu makaleye bakın: red-gate.com/simple-talk/sql/sql-training/…
Tom Arleth

2
Lütfen kodunuza gerekli bilgileri yalnızca bir bağlantı ile eklemeyin. Bu bağlantının bir gün süreceğini ve cevabınızın işe yaramayacağını düşünün. Bu yüzden lütfen devam edin ve temel bilgileri doğrudan cevabınıza ekleyin. Ancak bu bağlantıyı, başkalarının daha fazla bilgi alması için bir kaynak olarak da sağlayabilirsiniz.
L. Guthardt

3

Hata! Bu sorunun bir çiftini yayınladım ...

Cevap, Oracle'ın Greatest gibi yerleşik bir işlevi yoktur , ancak bir UDF ile 2 sütun için benzer bir sonuç elde edebilirsiniz, not, sql_variant kullanımı burada oldukça önemlidir.

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

kristof

Bu yanıtı gönderdi:

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
Not: EN BÜYÜK fonksiyon uygulaması 2 parametre için kehanet davranışıyla eşleşir, eğer herhangi bir parametre null olursa null döndürür
Sam Saffron

2
Sql_variant kullanırken dikkatli olmalısınız. İşleviniz aşağıdaki durumda beklenmedik bir sonuç verecektir: SELECT dbo.greatest (CAST (0 FLOAT AS, 100)
Neil

@Neil haklı (zor yoldan öğrendim), bu tür sorunları önlemek için bu işlevi nasıl geliştirirdiniz?
Luca

3

Burada null değerlerini işleyecek ve MSSQL'in eski sürümleriyle çalışacak bir örnek. Bu, popüler örneklerden birinde satır içi işleve dayanmaktadır:

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

2

Muhtemelen, bu şekilde yapmazdım, çünkü daha önce bahsedilen CASE yapılarından daha az verimlidir - belki de, her iki sorgu için de dizin oluşturmadığınız sürece. Her iki durumda da, benzer problemler için yararlı bir tekniktir:

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

Büyük sayılarla ilgili yukarıdaki cevap için, toplama / çıkarma işleminden önce çarpmayı yapabilirsiniz. Biraz daha hantal ama döküm gerektirmiyor. (Hız için konuşamam ama yine de oldukça hızlı olduğunu düşünüyorum)

SEÇ 0.5 * ((@ val1 + @ val2) + ABS (@ val1 - @ val2))

Değişiklikleri

SEÇ @ val1 * 0.5 + @ val2 * 0.5 + ABS (@ val1 * 0.5 - @ val2 * 0.5)

dökümden kaçınmak istiyorsanız en azından bir alternatif.


2

İşte NULL işlemeli bir IIF sürümü (Xin'in cevabına dayanarak):

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

Mantık aşağıdaki gibidir, değerlerden biri NULL ise, NULL olmayanı döndürür (her ikisi de NULL ise, NULL döndürülür). Aksi takdirde büyük olanı iade edin.

Aynı şey MIN için de yapılabilir.

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

1

Bunun gibi bir şey yapabilirsiniz:

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

En basit haliyle ...

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 için:

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

1

İşte @Scott Langham'ın basit NULL kullanımıyla yanıtı:

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;

İlginç kullanımı ise VALUESböyle satır içi, ben değilim emin bu daha basittir CASEveya IFF. Yine de, bu çözümün performansının diğer seçeneklere göre nasıl yığıldığını görmek isterim
Chris Schaller

0

Xin'in cevabına genişleyerek ve karşılaştırma değeri türünün INT olduğunu varsayarsak, bu yaklaşım da işe yarar:

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

Bu, örnek değerlerle dolu bir testtir:

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'de aşağıdakileri yapın:

-- 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'da şunu kullanabilirsiniz:

SELECT array_max(ARRAY[o.NegotiatedPrice, o.SuggestedPrice])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.