2つ以上の列の条件付き順序を作成する方法


10

MS SQL Server 2005では、条件付き並べ替えを使用して1つのクエリを作成していますが、2つの列を使用して条件付き並べ替えを行う方法がわかりません。

私がこのようなコードを書いた場合、それは正常に動作しています

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

2つ以上の列の条件付き順序を作成する方法がわかりません

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

動的TSQLを作成して使用するアイデアがありますが、sp_executesqlまだより良いアイデアを探していますか?



また、CASE .. ENDをORDER BYに含めるのは理にかなっていますか?。その質問は、PostgreSQLののコンテキストで提起されましたが、コメントや注意事項WRTのの最もダイナミックなクエリー対は、CASEこの場合にも適用することができます。
joanolo 2017年

回答:


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

あなたがもっと多くのケースを持っていると仮定し(私は1つ追加しました)、すべてのタイプは互換性があります、

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

これは複数列の並べ替えではありません。1次並べ替えの後に2次並べ替えがあります。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.