Cách đặt hàng có điều kiện cho hai hoặc nhiều cột


10

Trong MS SQL Server 2005 tôi đang viết một truy vấn với sắp xếp có điều kiện và vấn đề của tôi là tôi không biết làm cách nào để sắp xếp điều kiện bằng hai cột?

Nếu tôi viết mã như thế này thì nó hoạt động bình thường

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

Tôi không biết cách đặt hàng có điều kiện cho hai hoặc nhiều cột

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

Có một ý tưởng để tạo TSQL năng động và sử dụng sp_executesqlnhưng tôi vẫn đang tìm kiếm một ý tưởng tốt hơn?



Bạn cũng có thể kiểm tra Có hợp lý không khi có CASE .. HẾT trong ĐẶT HÀNG B? NG? . Mặc dù câu hỏi đó được đặt ra trong bối cảnh của PostgreSQL, hầu hết các nhận xét và cân nhắc truy vấn động WRT vs CASEcó thể được áp dụng cho trường hợp này.
joanolo

Câu trả lời:


12

Tôi sẽ thừa nhận tôi chưa bao giờ phải làm điều này trước đây vì vậy có một chút gãi đầu liên quan. Bảng ví dụ đơn giản để chứng minh:

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')

Sử dụng tham số @SortStyle để phân biệt giữa các thứ tự sắp xếp, @SortStyle = 1 sẽ sắp xếp theo col1 ASC, col2 DESCvà @ SortStyle = 2 sắp xếp theo 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

Làm thế nào để bạn đặt hàng theo một tham số bao gồm trường hợp sắp xếp đơn giản hơn chỉ bằng 1 cột.


5

Giả sử bạn có nhiều trường hợp hơn (tôi đã thêm một trường hợp) và tất cả các loại đều tương thích,

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

Nó không phải là một loại nhiều cột: bạn có một loại chính, theo sau là một loại thứ cấp. Chỉ cần nhìn vào hộp thoại sắp xếp trong Excel để xem tôi muốn nói gì.


1

Với ví dụ bạn đưa ra rất đơn giản:

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

Có một ý tưởng để tạo TSQL năng động và sử dụng sp_executesqlnhưng tôi vẫn đang nói dối để có ý tưởng tốt hơn.

Luôn luôn tốt để tránh SQL động khi có thể

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.