[英]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 = block
和bnumber = 1
我希望它成為表中的第一個值。 但是,當btype = block
和bnumber = 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 = block
和bnumber = 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.