論理関数 - GREATEST (Transact-SQL)

適用対象: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric

この関数は、1 つまたは複数の式のリストから最大値を返します。

Transact-SQL 構文表記規則

構文

GREATEST ( expression1 [ , ...expressionN ] )

引数

expression1, expressionN

比較可能なデータ型のコンマ区切りの式のリスト。 GREATEST 関数には、少なくとも 1 つの引数が必要です。また、254 個を超える引数はサポートされていません。

それぞれの式は、定数、変数、列名または関数、そして算術演算子、ビット演算子、文字列演算子の組み合わせにすることができます。 集計関数とスカラーのサブクエリを使用することができます。

戻り値の型

関数に渡される一連の型の中から最も優先順位の高いデータ型を返します。 詳細については、「データ型の優先順位 (Transact-SQL)」を参照してください。

すべての引数のデータ型が同じで、その型の比較がサポートされている場合、GREATEST はその型を返します。

それ以外の場合、関数は、比較の前に、すべての引数を最も優先順位の高いデータ型に暗黙的に変換し、この型を戻り値の型として使用します。

数値型の場合、戻り値の型のスケールは、最も優先順位の高い引数と同じになります。または、最も優先順位の高いデータ型の引数が複数ある場合は、最大のスケールになります。

解説

引数リスト内のすべての式は、比較可能なデータ型である必要があり、最も優先順位の高い引数のデータ型に暗黙的に変換できます。

すべての引数の、最も優先順位の高いデータ型への暗黙的な変換は、比較の前に行われます。

引数間の暗黙的な型変換がサポートされていない場合、関数は失敗し、エラーが返されます。

明示的な、および暗黙的な変換について詳しくは、「データ型の変換 (データベース エンジン)」を参照してください。

1 つ以上の引数が NULL でない場合、比較時に NULL 引数が無視されます。 すべての引数が NULL である場合、GREATESTNULL を返します。

文字引数の比較は、「照合順序の優先順位 (Transact-SQL)」の規則に従います。

次の型は GREATEST の比較ではサポートされていません: 8,000 バイトを超える varchar(max)varbinary(max)、または nvarchar(max)、cursor、geometrygeographyimage、バイト順序が指定されていないユーザー定義型、ntext、table、textxml

varchar(max)varbinary(max)、および nvarchar(max) の各データ型は、8,000 バイト以下の引数でサポートされています。また、比較の前に、それぞれ varchar(n)varbinary(n)nvarchar(n) に暗黙的に変換されます。

たとえば、varchar(max) は、1 バイト エンコード文字セットを使用している場合に最大 8,000 文字をサポートし、nvarchar(max) は最大 4,000 バイトペアをサポートできます (UTF-16 文字エンコードを想定)。

A. 定数のリストから最大値を返す

次の例では、入力される定数のリストから最大値が返されます。

戻り値の型のスケールは、最も優先順位の高いデータ型の引数のスケールによって決まります。

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

結果セットは次のようになります。

GreatestVal
--------
  7.0000

(1 rows affected)

B. 文字定数のリストから最大値を返す

次の例では、入力される文字定数のリストから最大値が返されます。

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

結果セットは次のようになります。

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

(1 rows affected)

C. 列引数のリストから最大値を返す

この例では、列引数のリストから最大値が返され、比較中の NULL 値は無視されます。 このサンプルでは、AdventureWorksLT データベースを使用します。これは、新しい Azure SQL データベースのサンプル データベースとしてすばやくインストールできます。 詳細については、「AdventureWorks sample databases」 (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;

結果セットは次のようになります。 LatestDate では、3 つの値のうち最大の日付値が選択され、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. ローカル変数で GREATEST を使う

この例では、GREATEST を使用して、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

結果セットは次のようになります。 0.7 より大きい値だけが表示されます。

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

(1 rows affected)

E. 列、定数、変数で GREATEST を使う

この例では、GREATEST を使用して、列、定数、変数を含む混合リストの最大値を決定します。

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

結果セットは次のようになります。

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

(3 rows affected)

次のステップ