T-SQL - LEAST 関数の使い方と注意点:複数の値から最小値を取得する方法
LEAST 関数の使い方と注意点:複数の値から最小値を取得する方法
T-SQL でプログラミングをしていると、複数の変数やカラムなどに入っている値を比較して、最も小さい値を取得したい時があります。
そんな時に便利なのが、LEAST 関数です。
SQL Server では 2022 以降で使えるようになった関数です。
この記事では、SQL Server における LEAST 関数の基本的な使い方と注意点などをご説明します。
※ 最大値を取得したい場合は、こちらの記事をご覧ください:GREATEST 関数の使い方と注意点
LEAST 関数の基本的な使い方
SQL Server の LEAST 関数は、入力引数として渡した複数の値の中で一番小さい値を返す関数です。
MySQL や PostgreSQL などでは前からありましたが、SQL Server では、SQL Server 2022 以降で使用可能になった、比較的新しい関数です。
LEAST 関数の基本的な構文は以下の通りです。
LEAST ( expression1 [ , ...expressionN ] )
入力引数には、「暗黙の型変換をして比較可能」なデータ型の値をカンマ区切りで指定します。
入力引数の値は、最低ひとつは必要で、最大 254 個まで指定できます。
入力引数のデータ型が違う場合、そのデータ型の中で最高の優先順位をもつデータ型に暗黙の型変換されて、比較が行われます。
比較の結果、最も小さい値を戻り値として返します。
それでは、LEAST 関数を使って複数の値から最も小さい値を取得してみます。
SELECT LEAST(1, 2.6, 0.4);
[実行結果]
LEAST 関数に 1, 2.6, 0.4 の 3 つの数値を渡した結果、一番小さい 0.4 が返っています。
文字列も比較でき、その時はアルファベット順に並べて一番最初にくる文字列が返ってきます。
SELECT LEAST('banana', 'orange', 'apple');
[実行結果]
LEAST 関数に 'banana', 'orange', 'apple' の 3 つの文字列を渡した結果、アルファベット順で一番最初にくる 'apple' が返っています。
LEAST 関数の NULL の扱いについて
LEAST 関数では、入力引数に NULL が含まれていても、他の引数に NULL 以外の値がある場合は、比較の際に NULL を無視します。
全ての入力引数が NULL の時のみ、戻り値も NULL になります。
この動作を実際に確認してみます。
SELECT LEAST(1, NULL, 0.4) AS ReturnValue1, LEAST(NULL, NULL, NULL) AS ReturnValue2;
[実行結果]
LEAST 関数に 1, NULL, 0.4 の 3 つの数値を渡した結果、NULL は無視され、1 と 0.4 で小さいほうの 0.4 が戻り値として返っています。
LEAST 関数に NULL, NULL, NULL を渡すと、戻り値も NULL になっていますね。
LEAST 関数の戻り値のデータ型について
先ほど、入力引数のデータ型が違う場合、そのデータ型の中で最高の優先順位をもつデータ型に暗黙の型変換されて、比較が行われます、と書きました。
LEAST の戻り値のデータ型も、その最高の優先順位のデータ型になります。
ですので、INT 型、DECIMAL 型、VARCHAR 型の数値の入力引数があった時は、INT 型と VARCHAR 型の値は DECIMAL 型に変換され、値を比較し、一番小さい値を戻り値として DECIMAL 型として返します。
この動作を実際に確認してみます。
DECLARE @Value DECIMAL(10, 2) = 2.5; SELECT LEAST(1, @Value, '0.3') AS ReturnValue, SQL_VARIANT_PROPERTY(LEAST(1, @Value, '0.3'), 'BaseType') AS ReturnValue_BaseType, SQL_VARIANT_PROPERTY(LEAST(1, @Value, '0.3'), 'Precision') AS ReturnValue_Precision, SQL_VARIANT_PROPERTY(LEAST(1, @Value, '0.3'), 'Scale') AS ReturnValue_Scale;
[実行結果]
まず、 LEAST 関数に 1 (INT 型)、@Value (= 2.5, DECIMAL(10, 2) 型)、'0.3' (VARCHAR 型) の 3 つの数値を渡した結果、0.30 が返っています。
INT 型、DECIMAL 型、VARCHAR 型で DECIMAL 型が最高の優先順位のデータ型なので、1 と '0.3' は DECIMAL(10, 2) に変換されて比較が行われ、一番小さかった 0.30 が戻り値になっています。
SQL_VARIANT_PROPERTY 関数を使って、戻り値のデータ型を確認したところ、BaseType が decimal、Precision が 10、Scale が 2 になっていることがわかります。
SQL Server 2022 未満の代替方法
最初にも書きましたが LEAST 関数は SQL Server 2022 以降でしか使えません。
それより前のバージョンの SQL Server では、最も小さい値を取得するのに CASE 式を使ったり、比較したい値をテーブルなどに INSERT して MIN 関数を使う必要があります。
参考までに、FROM 句で VALUES を使ってテーブルを作り、MIN 関数を使って最小値を取得するクエリーを載せておきます。
SELECT MIN(x) AS MinValue FROM (VALUES (1), (2.6), (0.4)) AS Table1(x);
[実行結果]
このクエリーを実行した結果、最小値の 0.4 が取得できていますね。
以上、LEAST 関数の基本的な使い方と注意点などをご説明しました。