【问题标题】:Order by case statement in dynamic sql动态sql中的case语句排序
【发布时间】:2015-04-21 12:52:06
【问题描述】:

我有一个名为 @Sorter 的参数,它传递一个 int(1 表示按某组列排序,0 表示按另一组列排序)。

在我的动态 SQL 中,当用户在执行过程时将 1 传递给该参数时,我让它工作。

' ORDER BY CASE WHEN + ''' + @Sorter + ''' = 1 THEN l.List END ASC,
        ''Year'', ''MonthNum'' DESC, i.Item ASC'

问题是当我尝试添加一个案例时,当参数从用户传递的值为 0 时,它开始抱怨。如:

' ORDER BY CASE WHEN + ''' + @Sorter + ''' = 1 THEN l.List END ASC,
           CASE WHEN + ''' + @Sorter + ''' = 0 THEN ''Variance'' END ASC,
            ''Year'', ''MonthNum'' DESC, i.Item ASC'

错误与常数有关。

【问题讨论】:

    标签: sql sql-server tsql dynamic-sql case-when


    【解决方案1】:

    你不需要额外的 case 语句,试试这个:

    ' ORDER BY CASE ''' + cast(@Sorter as varchar(1))+ ''' WHEN '1' THEN l.List
                                    WHEN '0' THEN ''Variance'' END ASC,
                ''Year'', ''MonthNum'' DESC, i.Item ASC'
    

    【讨论】:

    • 抱歉打错了,把l.list末尾的逗号去掉
    • 谢谢。我不需要投。恒定错误发生的情况是,在同一查询中使用 sum 聚合选择了列“variance”,因此我不得不在 case 语句中引用该 sum 聚合
    • 不客气,很高兴看到问题已解决,是的,您不需要强制转换,我猜可能问题出在代码的其他部分,我认为这是(使用一个案例陈述) 也许有用,无论如何,祝你好运。
    【解决方案2】:

    when 语句必须使用一个 case。

    ORDER BY 
         (CASE WHEN + ''' + @Sorter + ''' = 1 THEN l.List
               WHEN + ''' + @Sorter + ''' = 0 THEN ''Variance'' END) ASC,
          ''Year'', ''MonthNum'' DESC, i.Item ASC'
    

    【讨论】:

      猜你喜欢
      • 2012-05-25
      • 1970-01-01
      • 2017-03-10
      • 2013-01-21
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多