4

SQL Serverの3つの値から最小値を取得するにはどうすればよいですか?

MySQLの同じ関数であるLEASTと、SQL Serverでの比較?

4

5 に答える 5

9

ネストされたケースなしでこれを行うことができます:

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 では機能しないことに注意してください。

于 2012-05-13T13:53:53.180 に答える
4

明らかなネストされた 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 を抑制するための合体ステートメントは含まれていません。

唯一の利点は、別のプログラマーがあなたのコードを見てすぐに理解できることです。(そして、これがパフォーマンスのボトルネックでない限り、それはかなり良い考慮事項だと思います!)

于 2012-05-13T07:21:25.127 に答える
2

ネストされた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
于 2012-05-13T07:08:47.210 に答える
2

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)
于 2012-05-13T11:29:54.310 に答える
-5

T-SQLで「最小」関数を使用できます。

SELECT MIN(Value) FROM MyTable
于 2012-05-13T06:30:12.250 に答える