SQL 2005 を使用して、1 行のデータ内で 5 列の最小値を選択する方法はありますか?
したがって、次のようなデータ行があるとします。
id num1 num2 num3 num4 num5
1 22 51 4 99 34
では、SQL を使用して最小値を取得するにはどうすればよいでしょうか。
SQL 2005 を使用して、1 行のデータ内で 5 列の最小値を選択する方法はありますか?
したがって、次のようなデータ行があるとします。
id num1 num2 num3 num4 num5
1 22 51 4 99 34
では、SQL を使用して最小値を取得するにはどうすればよいでしょうか。
データ構造を正規化するように修正して、必要な情報を取得するためにこの複雑でパフォーマンスを損なうようなことをする必要がないようにします。
おそらく何かのような
select id
, least (num1, num2, num3, num4, num5)
from your_table
/
RDBMS のほとんどのフレーバーは LEAST() を提供します。
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
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 バージョンが必要です。しかたがない...