Udostępnij za pomocą


Funkcje logiczne - GREATEST (Transact-SQL)

Dotyczy do: SQL Server 2022 (16.x) i nowsze wersje Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL database in Microsoft Fabric

Funkcja ta zwraca maksymalną wartość z listy jednego lub więcej wyrażeń.

Transact-SQL konwencje składni

Składnia

GREATEST ( expression1 [ , ...expressionN ] )

Arguments

wyraz1, wyrażenieN

Lista wyrażeń oddzielonych przecinkami dowolnego porównywalnego typu danych. Funkcja wymaga GREATEST co najmniej jednego argumentu i obsługuje nie więcej niż 254 argumenty.

Każde wyrażenie może być stałą, zmienną, nazwą kolumny lub funkcją oraz dowolną kombinacją operatorów arytmetycznych, bitowych i ciągowych. Dozwolone są funkcje agregacyjne oraz podzapytania skalarne.

Typy zwracane

Zwraca typ danych o najwyższym przykładzie spośród zestawu typów przekazanych funkcji. Aby uzyskać więcej informacji, zobacz pierwszeństwo typu danych (Transact-SQL).

Jeśli wszystkie argumenty mają ten sam typ danych i typ jest wspierany do porównania, GREATEST zwraca ten typ.

W przeciwnym razie funkcja domyślnie przekształci wszystkie argumenty na typ danych o najwyższym pierwszeństwie przed porównaniem i użyje tego typu jako typu zwrotu.

Dla typów numerycznych skala typu zwrotu będzie taka sama jak argument o najwyższym precedensie, lub największa skala, jeśli więcej niż jeden argument dotyczy najwyższego typu danych o najwyższym precedensie.

Uwagi

Wszystkie wyrażenia na liście argumentów muszą mieć typ danych porównywalny i który można domyślnie przekształcić na typ danych argumentu o najwyższym pierwszeństwie.

Przed porównaniem następuje niejawna konwersja wszystkich argumentów na typ danych o najwyższym precedensie.

Jeśli nie jest obsługiwana niejawna konwersja typów między argumentami, funkcja zawiodła i zwróciła błąd.

Więcej informacji na temat konwersji ukrytej i jawnej można znaleźć w artykule Konwersja typów danych (Database Engine).

Jeśli jeden lub więcej argumentów nie NULLjest , to NULL argumenty są ignorowane podczas porównania. Jeśli wszystkie argumenty są , NULLto GREATEST zwraca NULL.

Porównywanie argumentów charakterowych opiera się na zasadach Precedencji Kolacji (Transact-SQL).

Następujące typy nie są obsługiwane do porównania w GREATEST: varchar(max),varbinary(max) lub nvarchar(max) przekraczających 8 000 bajtów, kursorach, geometrii, geografii, obrazach, typach zdefiniowanych przez użytkownika nieuporządkowanych bajtami, ntext, tabeli, tekstie oraz xml.

Typy danych varchar(max),varbinary(max) i nvarchar(max) są obsługiwane dla argumentów o rozmiarze 8 000 bajtów lub mniejszych i zostaną niejawnie przekształcone odpowiednio w varchar(n),varbinary(n) i nvarchar(n) przed porównaniem.

Na przykład varchar(max) może obsługiwać do 8 000 znaków przy użyciu zestawu znaków kodujących jednobajtowo, a nvarchar(max) może obsługiwać do 4 000 par bajtów (zakładając kodowanie znaków UTF-16).

Przykłady

A. Zwróć maksymalną wartość z listy stałych

Poniższy przykład zwraca maksymalną wartość z listy stałych, która jest dostępna.

Skala typu zwrotu jest określana przez skalę argumentu o najwyższym przykładzie danych o najwyższym prezencji.

SELECT GREATEST('6.62', 3.1415, N'7') AS GreatestVal;
GO

Oto zestaw wyników.

GreatestVal
--------
  7.0000

(1 rows affected)

B. Zwróć maksymalną wartość z listy stałych znaków

Poniższy przykład zwraca maksymalną wartość z listy stałych znaków, która jest dostępna.

SELECT GREATEST('Glacier', N'Joshua Tree', 'Mount Rainier') AS GreatestString;
GO

Oto zestaw wyników.

GreatestString
-------------
Mount Rainier

(1 rows affected)

C. Zwróć maksymalną wartość z listy argumentów kolumnowych

Ten przykład zwraca maksymalną wartość z listy argumentów kolumn i ignoruje NULL wartości podczas porównania. Ten przykład wykorzystuje bazę AdventureWorksLT danych, którą można szybko zainstalować jako przykładową bazę danych dla nowej bazy Azure SQL. Aby uzyskać więcej informacji, zobacz przykładowe bazy danych AdventureWorks .

SELECT P.Name,
    P.SellStartDate,
    P.DiscontinuedDate,
    PM.ModifiedDate AS ModelModifiedDate,
    GREATEST(P.SellStartDate, P.DiscontinuedDate, PM.ModifiedDate) AS LatestDate
FROM SalesLT.Product AS P
INNER JOIN SalesLT.ProductModel AS PM
    ON P.ProductModelID = PM.ProductModelID
WHERE GREATEST(P.SellStartDate, P.DiscontinuedDate, PM.ModifiedDate) >= '2007-01-01'
    AND P.SellStartDate >= '2007-01-01'
    AND P.Name LIKE 'Touring %'
ORDER BY P.Name;

Oto zestaw wyników. LatestDate wybiera największą wartość datową spośród trzech wartości, ignorując NULL.

Name                 SellStartDate           DiscontinuedDate    ModelModifiedDate       LatestDate
-------------------- ----------------------- ------------------- ----------------------- -----------------------
Touring Pedal        2007-07-01 00:00:00.000 NULL                2009-05-16 16:34:29.027 2009-05-16 16:34:29.027
Touring Tire         2007-07-01 00:00:00.000 NULL                2007-06-01 00:00:00.000 2007-07-01 00:00:00.000
Touring Tire Tube    2007-07-01 00:00:00.000 NULL                2007-06-01 00:00:00.000 2007-07-01 00:00:00.000

(3 rows affected)

D. Zastosowanie GREATEST z lokalnymi zmiennymi

Ten przykład służy GREATEST do określenia maksymalnej wartości listy zmiennych lokalnych w obrębie predykatu klauzuli WHERE .

CREATE TABLE dbo.Studies (
    VarX VARCHAR(10) NOT NULL,
    Correlation DECIMAL(4, 3) NULL
    );

INSERT INTO dbo.Studies
VALUES ('Var1', 0.2),
    ('Var2', 0.825),
    ('Var3', 0.61);
GO

DECLARE @PredictionA DECIMAL(2, 1) = 0.7;
DECLARE @PredictionB DECIMAL(3, 1) = 0.65;

SELECT VarX,
    Correlation
FROM dbo.Studies
WHERE Correlation > GREATEST(@PredictionA, @PredictionB);
GO

Oto zestaw wyników. Wyświetlane są tylko wartości większe niż 0,7.

VarX       Correlation
---------- -----------
Var2              .825

(1 rows affected)

E. Użycie GREATEST z kolumnami, stałymi i zmiennymi

Ten przykład służy GREATEST do określenia maksymalnej wartości mieszanej listy zawierającej kolumny, stałe i zmienne.

CREATE TABLE dbo.Studies (
    VarX VARCHAR(10) NOT NULL,
    Correlation DECIMAL(4, 3) NULL
    );

INSERT INTO dbo.Studies
VALUES ('Var1', 0.2),
    ('Var2', 0.825),
    ('Var3', 0.61);
GO

DECLARE @VarX DECIMAL(4, 3) = 0.59;

SELECT VarX,
    Correlation,
    GREATEST(Correlation, 0, @VarX) AS GreatestVar
FROM dbo.Studies;
GO

Oto zestaw wyników.

VarX       Correlation           GreatestVar
---------- --------------------- ---------------------
Var1       0.200                 0.590
Var2       0.825                 0.825
Var3       0.610                 0.610

(3 rows affected)

Dalsze kroki