SQLServerのcase/whenステートメントの「then」からselectステートメントを実行する方法はありますか? (thenステートメントからサブクエリを実行する必要があります。)whereステートメントでは使用できません。
select
case @Group
when 6500 then (select top 10 * from Table1)
when 5450 then (select top 5 * from Table1)
when 2010 then (select top 3 * from Table1)
when 2000 then (select top 1 * from Table1)
else 0
end as 'Report'
1つのオプションは、これをクエリから削除して、次のようなことを行うことです。
declare @Numrows int;
select @Numrows = (case @Group
when 6500 then 10
when 5450 then 5
when 2010 then 3
when 2000 then 1
else 0
end);
select top(@NumRows) *
from Table1;
次のようにすることもできます。
with const as (
select (case @Group
when 6500 then 10
when 5450 then 5
when 2010 then 3
when 2000 then 1
else 0
end) as Numrows
)
select t.*
from (select t.*, ROW_NUMBER() over () as seqnum
from table1 t
) t cross join
const
where seqnum <= NumRows;
この場合、seqnum
がリストに含まれないように、列をリストする必要があります。
ちなみに、通常top
を使用する場合は、order by
。それ以外の場合、結果は不確定です。
SELECT内にSELECTを含めることはできません。 IF ... ELSEを使用できます。
IF @Group = 6500
select top 10* from Table1 AS Report
ELSE IF @Group = 5450
select top 5* from Table1 AS Report
ELSE IF @Group = 2010
select top 3* from Table1 AS Report
ELSE IF @Group = 2000
select top 1* from Table1 AS Report
@Gordonはすでに答えを持っています。これはセカンドオピニオンです。動的クエリを使用できます。
declare @query varchar(max)
declare @Group int
set @query = ''
if @Group = 6500
set @query = 'select top 10 * from table1'
if @Group = 5450
set @query = 'select top 5 * from table1'
if @Group = 2010
set @query = 'select top 3 * from table1'
if @Group = 2000
set @query = 'select top 1 * from table1'
exec(@query)