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


10

在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但我仍在寻找更好的想法?



您还可以检查在ORDER BY中使用CASE .. END是否有意义?。尽管该问题是在PostgreSQL的上下文中提出的,但是大多数WRT 动态查询 vs 的注释和注意事项CASE都可以适用于这种情况。
joanolo

Answers:


12

我承认我之前从未做过,所以涉及到一些头部抓挠。简单的示例表来演示:

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参数区分排序顺序,col1 ASC, col2 DESC@SortStyle = 1将按排序,@ 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

您如何通过参数ORDER BY覆盖仅按1列进行排序的较简单情况。


5

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

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中的排序对话框即可了解我的意思。


1

通过示例,您可以很简单地看到:

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

有一个制作动态TSQL并使用它的想法,sp_executesql但我仍然希望有更好的想法。

尽可能避免使用动态SQL总是很不错的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.