我想撰寫一個查詢,它將根據多個條件對結果進行排序。
請參考以下虛擬表
| 姓名 | 領域 |
|---|---|
| 蘋果 | 郵箱 |
| .Apple2 | 雅虎 |
| _Apple3 | xyz |
| 蘋果4 | 關注 |
| 球 | 美國廣播公司 |
| .Ball2 | 電子煙 |
| _Ball3 | 郵箱 |
| 球4 | 雅虎 |
| 熊 | xyz |
| 貓 | 美國廣播公司 |
我想在表格上方排序
1 - 按已知域yahoo,gmail然后休息。
所以我想將結果行分成三部分。
第一節的行具有yahoo域,然后在第二節的行中,gmail域的最后一行。
2 - 按字母順序和末尾的所有特殊字符。
每個部分都應在name欄位中按字母順序進一步排序,最后帶有特殊字符。
結果應如下表所示。
| 姓名 | 領域 |
|---|---|
| 球4 | 雅虎 |
| .Apple2 | 雅虎 |
| 蘋果 | 郵箱 |
| _Ball3 | 郵箱 |
| 蘋果4 | 關注 |
| 球 | 美國廣播公司 |
| 熊 | xyz |
| 貓 | 美國廣播公司 |
| _Apple3 | xyz |
| .Ball2 | 電子煙 |
我已經設法通過以下查詢在底部使用特殊符號按字母順序對結果進行排序,但我無法正確排序的第一部分,即按已知域排序。
SELECT * FROM table1
ORDER BY
CASE WHEN name GLOB '[A-Za-z]*'
THEN name
ELSE '~' || name
END COLLATE NOCASE
uj5u.com熱心網友回復:
在ORDER BY子句中使用布爾運算式:
SELECT * FROM table1
ORDER BY domain = 'yahoo' DESC,
domain = 'gmail' DESC,
name GLOB '[A-Za-z]*' DESC,
LTRIM(LTRIM(name, '.'), '_');
這些布爾運算式中的每一個都計算為1fortrue或0for false。
請參閱演示。
uj5u.com熱心網友回復:
第 1 部分 - 首先按特定值排序,您可以執行以下操作
SELECT * FROM table1
ORDER BY CASE
WHEN domain = 'yahoo' then 0
WHEN domain = 'gmail' then 1
ELSE 2
END ASC
第 2 部分 - 然后在其中您要按名稱排序,因此將您現有的名稱排序添加到我們的 ORDER BY 中,這樣我們就有了:
SELECT * FROM table1
ORDER BY CASE
WHEN domain = 'yahoo' then 0
WHEN domain = 'gmail' then 1
ELSE 2
END ASC,
CASE WHEN name GLOB '[A-Za-z]*'
THEN name
ELSE '~' || name
END COLLATE NOCASE
uj5u.com熱心網友回復:
可能不是最高效的解決方案,但在這種特殊情況下它應該與聯合作業:
(
SELECT
*
FROM
table1
WHERE
domain like 'yahoo'
ORDER BY
name desc
)
UNION
(
SELECT
*
FROM
table1
WHERE
domain like 'gmail'
ORDER BY
name desc
)
UNION
(
SELECT
*
FROM
table1
WHERE
domain not like 'yahoo'
OR domain not like 'gmail'
ORDER BY
domain desc,
name desc
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486969.html
標籤:爪哇 安卓 sql sqlite sql-order-by
