AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 7301
Accepted
adopilot
adopilot
Asked: 2011-10-28 00:55:59 +0800 CST2011-10-28 00:55:59 +0800 CST 2011-10-28 00:55:59 +0800 CST

如何对两列或多列进行条件排序

  • 772

在 MS SQL Server 2005 中,我正在编写一个带有条件排序的查询,我的问题是我不知道如何使用两列进行条件排序?

如果我写这样的代码它可以正常工作

select
    *
from 
    table
order by 
    case @pkr 
           when 'kol' then kol
           when 'nci' then nci
    end

我不知道如何对两列或更多列进行条件排序

select
    *
from 
    table
order by 
    case @pkr
        when 'KOL-NCI' then kol,nci
        when 'kol-MPCI' then kol,mpci
    end

有一个想法可以制作动态 TSQL 并使用sp_executesql,但我仍在寻找更好的想法?

sql-server order-by
  • 4 4 个回答
  • 61355 Views

4 个回答

  • Voted
  1. Best Answer
    Mark Storey-Smith
    2011-10-28T01:42:45+08:002011-10-28T01:42:45+08:00

    我承认我以前从来没有这样做过,所以有点挠头。简单的示例表来演示:

    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') AND type in (N'U'))
        DROP TABLE [dbo].[MyTable]
    GO
    
    CREATE TABLE dbo.MyTable
    (
        col1 INT
        , col2 CHAR(1)
    )
    GO
    
    INSERT dbo.MyTable (col1, col2) VALUES (1, 'A')
    INSERT dbo.MyTable (col1, col2) VALUES (1, 'B')
    INSERT dbo.MyTable (col1, col2) VALUES (1, 'C')
    INSERT dbo.MyTable (col1, col2) VALUES (2, 'A')
    INSERT dbo.MyTable (col1, col2) VALUES (2, 'B')
    INSERT dbo.MyTable (col1, col2) VALUES (2, 'C')
    INSERT dbo.MyTable (col1, col2) VALUES (3, 'A')
    INSERT dbo.MyTable (col1, col2) VALUES (3, 'B')
    INSERT dbo.MyTable (col1, col2) VALUES (3, 'C')
    

    使用@SortStyle 参数来区分排序顺序,@SortStyle =1 将排序col1 ASC, col2 DESC,@SortStyle=2 将排序col2 DESC, col1 ASC。

    DECLARE @SortStyle INT
    SET @SortStyle = 1
    
    SELECT
        col1
        , col2
    FROM
        dbo.MyTable
    ORDER BY
        CASE
            WHEN @SortStyle = 1 THEN col1
        END ASC,
        CASE
            WHEN @SortStyle = 1 THEN col2
        END DESC,
        CASE
            WHEN @SortStyle = 2 THEN col2
        END DESC,
        CASE
            WHEN @SortStyle = 2 THEN col1
        END ASC
    
    SET @SortStyle = 2
    
    SELECT
        col1
        , col2
    FROM
        dbo.MyTable
    ORDER BY
        CASE
            WHEN @SortStyle = 1 THEN col1
        END ASC,
        CASE
            WHEN @SortStyle = 1 THEN col2
        END DESC,
        CASE
            WHEN @SortStyle = 2 THEN col2
        END DESC,
        CASE
            WHEN @SortStyle = 2 THEN col1
        END ASC
    

    How do you ORDER BY a parameter涵盖了仅按 1 列排序的更简单情况。

    • 14
  2. gbn
    2011-10-28T02:08:48+08:002011-10-28T02:08:48+08:00

    假设您有更多案例(我添加了一个),并且所有类型都兼容,

    order by 
        case @pkr
            when 'KOL-NCI' then kol
            when 'kol-MPCI' then kol
            when 'foo-bar' then foo
        end,
        case @pkr
            when 'KOL-NCI' then nci
            when 'kol-MPCI' then mpci
            when 'foo-bar' then bar 
        end
    

    它不是多列排序:您有一个主要排序,然后是次要排序。只需查看 Excel 中的排序对话框即可了解我的意思。

    • 5
  3. Jack Douglas
    2011-10-28T02:01:24+08:002011-10-28T02:01:24+08:00

    通过您给出的示例,它很简单:

    select *
    from table
    order by kol, case @pkr
                    when 'KOL-NCI' then nci
                    when 'kol-MPCI' then mpci
                  end
    

    有一个想法可以制作动态 TSQL 并使用sp_executesql,但我仍在寻找更好的想法。

    尽可能避免使用动态 SQL 总是好的

    • 1
  4. Kalebe Calixto
    2022-06-01T13:54:22+08:002022-06-01T13:54:22+08:00

    有一种更简单的方法,不需要一个过程,或者几个“案例”,只需使用数组

    前任:

    
    select
        col1, col2, col3, col4
    from 
        table
    order by 
        case @parameter
            when '1' then array[col1,col3,col4]
            when '2' then array[col1]
            when '3' then array[col4,col2]
        end
    
    

    在 postgresql 中测试

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve