【问题标题】:select subquery inside then of case when statement?在 case when 语句的 then 中选择子查询?
【发布时间】:2013-03-25 14:00:50
【问题描述】:

有没有办法从 sql server 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'

【问题讨论】:

  • 您想在单个列值中返回 10 行、5 行或 3 行等?不确定我是否关注。
  • 这些只是我需要做的例子......真正的查询要长得多,而且不是最重要的。

标签: sql sql-server-2008 subquery case


【解决方案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。否则,结果是不确定的。

【讨论】:

  • 好吧,子查询只是必须在“then”语句中运行查询的示例。我要运行的实际查询有列和总和以及一大堆其他东西。
  • @PerryDay 。 . .好吧,你不能用一条 SQL 语句来做到这一点。
  • 我错误地投了反对票。现在我无法删除它。您可以编辑以便我删除反对票吗?对不起
  • @vpascoal 。 . .谢谢。我对匿名投票变得相当敏感(无论是在我的帖子上还是在其他人的帖子上)。
【解决方案2】:

您不能在 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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这个编译没有错误,但它不显示查询的结果。我需要它来显示结果。
    • 需要给Group变量赋值,如Set @Group = 6500,否则查询为空。
    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2021-05-15
    • 2019-08-02
    • 2021-09-13
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多