2

SQL 2005 を使用して、1 行のデータ内で 5 列の最小値を選択する方法はありますか?

したがって、次のようなデータ行があるとします。

id    num1    num2    num3   num4    num5
1     22      51      4      99      34

では、SQL を使用して最小値を取得するにはどうすればよいでしょうか。

4

6 に答える 6

2

データ構造を正規化するように修正して、必要な情報を取得するためにこの複雑でパフォーマンスを損なうようなことをする必要がないようにします。

于 2011-08-17T20:46:08.130 に答える
2

おそらく何かのような

select id
       , least (num1, num2, num3, num4, num5)
from your_table
/

RDBMS のほとんどのフレーバーは LEAST() を提供します。

于 2011-08-17T18:21:57.790 に答える
1

UDF を作成できます。

create function GetMin(@N1 int, @N2 int, @N3 int, @N4 int, @N5 int)
returns table as
return (select min(N) as Value
        from (select @N1 
              union all 
              select @N2
              union all 
              select @N3
              union all 
              select @N4
              union all 
              select @N5) as T(N))

で、こんな使い方。

declare @T table
(
  id int, 
  num1 int, 
  num2 int, 
  num3 int,  
  num4 int,   
  num5 int
)

insert into @T values
(1,     22,      51,      4,      99,      34),
(2,     222,     251,     24,     299,     234)

select id,
       M.Value
from @T
  cross apply dbo.GetMin(num1, num2, num3, num4, num5) as M

または、UDF をスキップしてクエリを直接使用することもできます。

select id,
       M.Value
from @T
  cross apply (select min(N) as Value
               from (select num1 
                     union all 
                     select num2
                     union all 
                     select num3
                     union all 
                     select num4
                     union all 
                     select num5) as T(N)) as M
于 2011-08-17T18:46:32.430 に答える
0

TSQL で実行できますが、少し準備が必要です...

まず、関数が必要です:
(カンマで区切られた整数の文字列を取り、最大の整数を返します)

CREATE Function [dbo].[GreatestInt]  
( @Array varchar(max) )
Returns int As  

BEGIN 

DECLARE @end Int
DECLARE @start Int
DECLARE @tbl_int Table (myInt Int)
DECLARE @return Int

SET @Array =  @Array + ',' 
SET @start=1
SET @end=1

WHILE @end<Len(@Array)
    BEGIN
        SET @end = CharIndex(',', @Array, @end)
        INSERT INTO @tbl_int 
            SELECT
                Cast(Substring(@Array, @start, @end-@start) As Int)

        SET @start=@end+1
        SET @end = @end+1
    END

SET @return = (SELECT MAX(myInt) FROM @tbl_int)

RETURN @return
END

次に、整数の文字列を作成します (これは、TSQL があまり得意ではない部分です):
(SELECT 内)

stuff(
        stuff([num5], 1, 0,',')
        ,1,0,
        stuff(
            stuff([num4], 1, 0,',')
            ,1,0,
            stuff(
                stuff([num3], 1, 0,',')
                ,1,0,
                stuff(
                    stuff([num2], 1, 0,',')
                    ,1,0,
                    [num1]
                    )
                )
            )
        )

したがって、関数を使用するには:

SELECT
   id,
   dbo.GreatestInt( stuff(
            stuff([num5], 1, 0,',')
            ,1,0,
            stuff(
                stuff([num4], 1, 0,',')
                ,1,0,
                stuff(
                    stuff([num3], 1, 0,',')
                    ,1,0,
                    stuff(
                        stuff([num2], 1, 0,',')
                        ,1,0,
                        [num1]
                        )
                    )
                )
            )
        )
FROM
   myTable

@mikael が彼の回答で行った方法の代わりに、私がこのようにした理由 (+1 したのは、それがあなたの質問に答えるからです) は、このアプローチが 5 つだけでなく、任意の数のフィールドで機能するためです。しかし正直なところ、TSQL にはここで改善の余地があります。実際には、plsql の最大/最小関数の tsql バージョンが必要です。しかたがない...

于 2011-08-17T19:20:52.090 に答える