当前位置: 首页 > 面试题库 >

DESC和ASC作为存储过程中的参数

狄宪
2023-03-14
问题内容

我使用以下SP来对新闻文章列表进行分页。您可能会猜到,@count是要返回的行数,@start是从中选择行的索引(按内部查询排序),@orderby指示要排序的列,并@orderdir指示是否对一个方向或另一个方向进行排序。在添加参数之前,我的原始查询在
这里@orderdir

ALTER PROCEDURE [mytable].[news_editor_paginate]
    @count int,
    @start int,
    @orderby int,
    @orderdir int
AS 
BEGIN
    SET NOCOUNT ON; 
    SELECT TOP (@count) * FROM 
    (  
        SELECT ne.*,n.publishstate, 
            (CASE WHEN @orderdir = 1 THEN
                ROW_NUMBER() OVER (
                    ORDER BY                    
                        CASE WHEN @orderby = 0 THEN ne.[time] END DESC,
                        CASE WHEN @orderby = 1 THEN ne.lastedit END DESC,    
                        CASE WHEN @orderby = 2 THEN ne.title END ASC
                    )
            WHEN @orderdir = 2 THEN
                ROW_NUMBER() OVER (
                    ORDER BY                    
                        CASE WHEN @orderby = 0 THEN ne.[time] END ASC,    
                        CASE WHEN @orderby = 1 THEN ne.lastedit END ASC,
                        CASE WHEN @orderby = 2 THEN ne.title END DESC
                    )
                END
            ) AS num
            FROM news_edits AS ne
            LEFT OUTER JOIN news AS n
            ON n.editid = ne.id 
        ) 
     AS a
    WHERE num > @start
END

现在,实际上没有任何问题,但是@orderby参数不起作用。如果提供1作为@orderdir参数,它将为我提供与提供2作为该参数完全相同的结果。


问题答案:

行号不会在每一行上求值,但是case语句是有效的,因此无论大小写如何,您都被行号所困扰。

尝试以下方法:

            ROW_NUMBER() OVER (
                ORDER BY                    
                    CASE WHEN @orderby = 0 AND @orderdir = 1 THEN ne.[time] END DESC,    
                    CASE WHEN @orderby = 0 AND @orderdir = 2 THEN ne.[time] END ASC,    
                    CASE WHEN @orderby = 1 AND @orderdir = 1 THEN ne.lastedit END DESC,
                    CASE WHEN @orderby = 1 AND @orderdir = 2 THEN ne.lastedit END ASC,
                    CASE WHEN @orderby = 2 AND @orderdir = 1 THEN ne.title END ASC
                    CASE WHEN @orderby = 2 AND @orderdir = 2 THEN ne.title END DESC
                )


 类似资料:
  • 我有2个MYSQL表,用户和分数。详细信息: 用户表: 得分表: 我的目的是获得20个用户列表,这些用户具有点域排序DESC(降序)和平均时间域排序ASC(升序)。我使用以下查询: 结果是: 结果是错误的,因为第一行正好是point=100,avg_time=60。 我期望的结果是: 我尝试了很多次不同的查询,但结果仍然是错误的。你能给我一些解决方案吗? 提前谢谢!

  • 问题内容: 我有大约六种通用但相当复杂的存储过程和函数,我想以一种更通用的方式使用它们。 理想情况下,我希望能够将表名作为参数传递给过程,因为当前它是硬编码的。 我所做的研究表明,我需要将过程中所有现有的SQL转换为使用动态SQL,以便从参数中拼接动态表名称,但是我想知道是否还有一种更简便的方法可以通过另一种方式引用该表? 例如: 如果是这样,如何从表名设置@MyTable变量? 我正在使用SQL

  • 输入/输出示例: infoData序列化输入:总长度5191 当,NVARCHAR(1000),infoData值:总长度-1003 帮助我获得完整的info_Data原样,没有任何丢失或截断。 提前道谢。

  • 我正在尝试执行从hibernate到oracle表的插入操作。我的存储过程是:-

  • 问题内容: 桌子: 的PHP HTML结果: 任何人都注意到桌上的结果。时代是不正确的顺序? 我改变了另一种方式与ASC / DESC,仍然显示最后一个id_timeslot的时间吗? 预期结果: 问题答案: 您正在对记录进行分组,因此每种情况下您只会看到最后一次。 尝试使用

  • 问题内容: 我正在创建一些存储过程来管理我的数据库。特别是,我想创建一个存储过程来编辑特定行的一列,但是我想通过将列名作为参数传递来做到这一点。 那就是我想做的 使用该参数,我找到了要编辑的特定行,并且我想使用该参数来仅编辑我想要的列。 正如我在其他主题上所读到的那样,我已经尝试使用或定义局部变量,但没有找到解决方案。 有什么帮助吗? 问题答案: 您将需要使用 动态SQL : 请注意,正如Paul