SQL Serverの3つの値から最小値を取得するにはどうすればよいですか?
MySQLの同じ関数であるLEASTと、SQL Serverでの比較?
ネストされたケースなしでこれを行うことができます:
select (case when val1 < val2 and val1 < val3 then val1
when val2 < val3 then val2
else val3
end) as least_of_three
これは、それが何をしているのかについてはかなり明確に見えます。また、非常に簡単に一般化できます。
NULL には注意してください -- LEAST と GREATEST は無視します。これらを処理する必要がある場合は、もう少し面倒です。
select (case when val1 <= coalesce(val2, val1) and val1 <= coalesce(val3, val1) then val1
when val2 <= coalesce(val3, val2) then val2
else val3
end) as least_of_three
「<」を「<=」に変更したことに注意してください。合体を使用して、true と評価することで値を「無視」します。したがって、val2 が null の場合、val1 は常に val2 より小さくなります。この方法を選択したのは、すべてのデータ型 (文字列、数値、日付) で機能するためです。
編集:
通常、7 年前の質問に戻って回答を書くことはありませんが、この質問は明らかに SQL Server に関するものです。最良のアプローチは次を使用しますapply
。
select t.*, max_val
from t cross apply
(select max(v.val) as max_val
from (values (t.val1), (t.val2), . . .
) v(val);
横方向の結合がサポートされていないため、このソリューションは MySQL では機能しないことに注意してください。
明らかなネストされた case ステートメントは次のようになります。
select case when val1 < val2 then
case when val1 < val3 then val1
else val3
end
when val2 < val3 then val2
else val3
end
from cols;
の上
create table cols (val1 int, val2 int, val3 int);
より多くの比較に簡単にスケーリングすることはできません。また、null を抑制するための合体ステートメントは含まれていません。
唯一の利点は、別のプログラマーがあなたのコードを見てすぐに理解できることです。(そして、これがパフォーマンスのボトルネックでない限り、それはかなり良い考慮事項だと思います!)
ネストされたCASEステートメントを避けたい場合は、これでうまくいきます(少し厄介ですが)。
CREATE TABLE #t(ID INT, V1 INT, V2 INT, V3 INT)
INSERT INTO #t VALUES
(1, 10, 20, 30)
, (2, 60, 50, 40)
SELECT * FROM #t t1
CROSS APPLY (SELECT MAX(V), MIN(V) FROM (
SELECT V1 AS V
UNION SELECT V2
UNION SELECT V3
) T) AS t2(VMAX, VMIN)
DROP TABLE #t
mysql の Least() 関数に似た関数が SQL サーバーにありません
MySQL の Least() 関数は次のことを行います
2 つ以上の引数を取り、最小 (最小値) の引数を返します。引数は、次のルールを使用して比較されます。
いずれかの引数が NULL の場合、結果は NULL になります。比較は必要ありません。
戻り値が INTEGER コンテキストで使用されるか、すべての引数が整数値である場合、それらは整数として比較されます。
戻り値が REAL コンテキストで使用されるか、すべての引数が実数値である場合、それらは実数として比較されます。
引数に数字と文字列が混在している場合、それらは数字として比較されます。
引数が非バイナリ (文字) 文字列の場合、引数は非バイナリ文字列として比較されます。
それ以外の場合、引数はバイナリ文字列として比較されます。
SQL サーバーの Min() 関数は、引数を取らないテーブル内の列の最小値を返します。
これはシミュレーションですが、整数しか取り込めないため、Least とは異なります。
CREATE FUNCTION [dbo].[GetSmallest]
(
-- Add the parameters for the function here
@val1 int, @val2 int, @val3 int
)
RETURNS int
AS
BEGIN
Declare @result int
set @result = case when @val1 < @val2 then
case when @val1 < @val3 then
@val1
else
@val3
end
when @val2 < @val3 then
@val2
else
@val3
end
return @result
END
これがあなたの呼び方です
SELECT [dbo].[GetSmallest] ( 32 ,31 ,6)
T-SQLで「最小」関数を使用できます。
SELECT MIN(Value) FROM MyTable