簡體   English   中英

在多個列上的條件排序依據

[英]Conditional Order By on multiple columns

我有以下查詢:

SELECT year, month, btype, bnumber 
FROM some_table 
ORDER BY year ASC, month ASC, bnumber ASC, btype ASC 

btype具有以下值

block
week
month

btype = blockbnumber = 1我希望它成為表中的第一個值。 但是,當btype = blockbnumber = 2我希望它bnumber = 2所有其他bnumber = 2值之后。

查詢當前返回值的方式如下:

year    month   btype   bnumber
======  ======  ======  ======
2017    3       block   1
2017    3       month   1
2017    3       week    1
2017    3       block   2
2017    3       week    2
2017    3       week    3
2017    3       week    4

這就是我想要的結果:

year    month   btype   bnumber
======  ======  ======  ======
2017    3       block   1
2017    3       month   1
2017    3       week    1
2017    3       week    2
2017    3       block   2
2017    3       week    3
2017    3       week    4

使用CASE可能會發生這種情況嗎? 我嘗試了幾種不同的變體,但似乎無法使其正常工作。 這是我試圖使btype = blockbnumber = 2被視為bnumber = 3的最后一條語句,但是它沒有用:

ORDER BY year ASC, month ASC, 
         CASE btype 
            WHEN 'block' and bnumber = '2' THEN bnumber = '3' 
            ELSE 1 
         END ASC, 
         bnumber ASC, 
         btype ASC

嘗試這個:

SELECT year, month, btype, bnumber
FROM some_table
ORDER BY year ASC, month ASC, 
         CASE 
            -- Place btype ='block' / bnumber = '1' at the first place
            WHEN btype ='block' and bnumber = '1' THEN 1
            -- Prioritize bnumber = '2' / btype <> 'block' over 
            -- bnumber = '2' / btype = 'block'
            WHEN bnumber = '2' THEN CASE 
                                      WHEN btype <> 'block' THEN 1.1
                                      ELSE 1.2
                                    END            
            ELSE bnumber  
         END ASC, 
         bnumber ASC, 
         btype ASC

在這里演示

這樣的事情將滿足規范:

ORDER
   BY year
    , month
    , bnumber
    , CASE
        WHEN btype = 'block' AND bnumber > 1 
        THEN 'zzz'
        ELSE btype
      END

CASE表達式通常將返回btype的值,這就是我們通常希望對bnumber進行排序之后(按字母順序)進行排序的樣子。

我們處理btype='block' and bnumber>1 ...的“特殊”情況,而不是返回btype ,而是返回一個特殊的高值'zzz',該值高於btype的所有其他值。


一個更可靠的解決方案是在btype列之前在btype BY中使用單獨的表達式:

ORDER 
   BY year
    , month
    , bnumber
    , CASE
        WHEN btype = 'block' AND bnumber > 1 
        THEN 1
        ELSE 0
      END
    , btype

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM