按条款动态排序

阿比吉斯

在下面的查询中,我在这里按条款使用了动态订单-

        DECLARE @employee TABLE
        ( 
            ID INT IDENTITY(1,1)
            ,Name VARCHAR(50)
            ,Gender VARCHAR(20)
            ,DOB DATETIME
            ,TotProjects INT
        )


        INSERT INTO @employee
        (   
            Name
            ,Gender 
            ,DOB 
            ,TotProjects
        )
        VALUES 
        ('Mike', 'Male', '07/26/1986', 3)
        ,('Neil' , 'Male', '02/21/1990', 2)
        ,('Jessica' ,'FeMale','04/15/1988', 9)
        ,('Tony','Male','03/18/1987', 6)
        ,('Adam','Male','01/16/1983', 12)


        DECLARE @searchCol VARCHAR(50) = 'PROJECTS' 
        DECLARE @direction VARCHAR(5) = 'ASC'   

        SELECT *
        FROM @employee
        ORDER BY 
                CASE WHEN @direction = 'DESC'
                THEN
                CASE 
                    WHEN @searchCol = 'NAME' THEN Name 
                    WHEN @searchCol = 'GENDER' THEN Gender
                    WHEN @searchCol = 'DOB' THEN CAST (DOB AS VARCHAR(20)) 
                    WHEN @searchCol = 'PROJECTS' THEN ABS(TotProjects)
                END 
            END DESC,
            CASE WHEN @direction = 'ASC'
                THEN
                CASE 
                    WHEN @searchCol = 'NAME' THEN Name 
                    WHEN @searchCol = 'GENDER' THEN Gender
                    WHEN @searchCol = 'DOB' THEN CAST (DOB AS VARCHAR(20)) 
                    WHEN @searchCol = 'PROJECTS' THEN CAST(TotProjects AS VARCHAR(20))
                END
            END ASC



        --- Ends Here -----

因此,在上面的查询中,我从一个名为-@direction的变量获取了按方向排序,然后我将传递变量-@searchCol来说要对我的哪一列进行排序。

现在,如果我通过-“名称”或“性别”,则其排序就很好了,因为它们都是VARCHAR列,但是如果我要对“项目”或“ DOB”进行排序,则排序方式不正确。(可能是它的ascii值)。当我通过Direction-@direction-“ ASC”和@searchCol-“ Projects”时,结果很奇怪。基本上,它不会基于“项目”和“ DOB”进行排序,因为它们分别是“数字”和“日期时间”字段。

钙,请您对此有所了解。

我将以不同的方式实现动态排序。我相信通过这样做,数据库引擎将能够更有效地使用索引(前提是您已拥有索引)

 SELECT *
    FROM @employee
    ORDER BY 
    CASE WHEN @direction = 'DESC' AND @searchCol = 'NAME' THEN Name ELSE ' ' END DESC,
    CASE WHEN @direction = 'DESC' AND @searchCol = 'GENDER' THEN Gender ELSE ' ' END DESC,
    CASE WHEN @direction = 'DESC' AND @searchCol = 'DOB' THEN DOB ELSE CAST(0 AS DATE) END DESC,
    CASE WHEN @direction = 'DESC' AND @searchCol = 'PROJECTS' THEN TotProjects ELSE 0 END DESC,
    CASE WHEN @direction = 'ASC' AND @searchCol = 'NAME' THEN Name ELSE ' ' END,
    CASE WHEN @direction = 'ASC' AND @searchCol = 'GENDER' THEN Gender ELSE ' ' END,
    CASE WHEN @direction = 'ASC' AND @searchCol = 'DOB' THEN DOB ELSE CAST(0 AS DATE) END,
    CASE WHEN @direction = 'ASC' AND @searchCol = 'PROJECTS' THEN TotProjects ELSE 0 END

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

包含计算列的按条款动态排序不起作用

来自分类Dev

包含计算列的按条款进行动态排序不起作用

来自分类Dev

排序和选择-Neo4j中按条款进行的较慢排序和不同的操作

来自分类Dev

按条款分组与Distinct()

来自分类Dev

MySQL:按条款分组

来自分类Dev

动态或条款Linq

来自分类Dev

按集合属性对动态LINQ排序

来自分类Dev

动态存储过程按列排序

来自分类Dev

按集合属性对动态LINQ排序

来自分类Dev

动态下拉无法按字母顺序排序

来自分类Dev

使用SYNCSORT按条款分组

来自分类Dev

按条款未正确输出

来自分类Dev

SQL查询按条款分组

来自分类Dev

HQL中的按条款分组

来自分类Dev

按条款 Oracle 的特定顺序

来自分类Dev

Laravel 4雄辩的动态条款

来自分类Dev

C#动态linq按Expando对象排序

来自分类Dev

正确使用dplyr :: arrange和按列动态排序的方法

来自分类Dev

C#动态linq按Expando对象排序

来自分类Dev

按属性对XML文件进行排序,但保留其父结构[动态]

来自分类Dev

按项目数组动态排序列表

来自分类Dev

按条款分组的许多字段

来自分类Dev

按条款分组,仅用于特定记录

来自分类Dev

动态救援条款,此代码如何工作?

来自分类Dev

加入和按条款分组给出错误的输出

来自分类Dev

如何在子查询中使用按条款分组

来自分类Dev

MySQL | 按条款划分-在XAMP上不起作用

来自分类Dev

加入和按条款分组给出错误的输出

来自分类Dev

按某些条款导出文本文件