In SQL Server 2012 oder höher können Sie eine Kombination aus IIF
und ISNULL
(oder COALESCE
) verwenden, um maximal 2 Werte abzurufen.
Auch wenn einer von ihnen NULL ist.
IIF(col1 >= col2, col1, ISNULL(col2, col1))
Oder wenn Sie möchten, dass 0 zurückgegeben wird, wenn beide NULL sind
IIF(col1 >= col2, col1, COALESCE(col2, col1, 0))
Beispielausschnitt:
-- 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
Ergebnis:
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
Aber wenn man mehrere Werte summieren muss?
Dann schlage ich vor, CROSS APPLY auf eine Aggregation der VALUES anzuwenden.
Dies hat auch den Vorteil, dass dadurch gleichzeitig andere Dinge berechnet werden können.
Beispiel:
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
GREATEST
Funktion implementiert . SQLite emuliert die Unterstützung, indem mehrere Spalten imMAX
Aggregat zugelassen werden.