วิธีทำการสั่งแบบมีเงื่อนไขสำหรับคอลัมน์สองคอลัมน์ขึ้นไป


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แต่ฉันยังคงมองหาแนวคิดที่ดีกว่าอยู่ใช่ไหม



นอกจากนี้คุณยังสามารถตรวจสอบมันมีเหตุผลที่จะมี CASE .. จบใน ORDER BY? . แม้ว่าคำถามนั้นถูกวางในบริบทของ PostgreSQL ความคิดเห็นและข้อพิจารณาส่วนใหญ่ WRT แบบไดนามิกเคียวรี vs CASEสามารถใช้ได้กับกรณีนี้
joanolo

คำตอบ:


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 ความแตกต่างระหว่างคำสั่งเรียงลำดับ @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

คุณ 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 แบบไดนามิกถ้าเป็นไปได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.