web-dev-qa-db-ja.com

caseのwhenステートメント内でサブクエリを選択しますか?

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'
7
Rainhider

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。それ以外の場合、結果は不確定です。

2
Gordon Linoff

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
2
Young Bob

@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)
1
ljh