在语句的情况下选择子查询?
问题描述:
有没有一种方法在sql server的情况下/运行时,从“那么” 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'
答
一种选择是从查询中删除这一点,做这样的事情:
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中。您可以使用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)
你想在单列值内返回10行或5行或3行等?不知道我跟着。 – 2013-04-03 18:38:35
这些仅仅是什么,我需要做的例子....真正的查询是更长的时间,而不是顶部anythings。 – Rainhider 2013-04-03 18:49:15