2016-11-10 79 views
0
Column : VARCHAR 

我有這樣的選擇:從表訂購VARCHAR和數量

ae 
10000 
10005 
ad 
ab 
ac 
10010 

SELECT列,我想訂購他們是這樣的:(數量排序,然後的Varchar訂購)

SELECT列FROM TABLE ORDER BY column

1 - 10000 
2 - 10005 
3 - 10010 
4 - ab 
5 - ac 
6 - ad 
7 - ae 
+1

從來沒有混合的字母和數字?你想在10之前還是之後2? – jarlh

+0

有一個混合 –

+0

你試過你選擇語句嗎?你有什麼結果? – JSapkota

回答

2

由於列是字符列,因此數字將按二進制排序排序。你想他們用數字排序,這意味着你需要2 ORDER BY子句

  1. 一個數字,只有數字字符被認爲是
  2. 標準的二叉排序
select column_name 
    from table 
order by case when regexp_like(column_name, '^\d+$') then to_number(column_name) end 
     , column_name 

常規表達是

  • ^ - 錨字符串
  • \d的開始 - 只匹配數字
  • + - 錨字符串

它提供的結束 - 任意次數

  • $匹配前面的表達式強制在將列轉換爲初始排序的數字之前僅存在數字。

    更一般地說,將數字和字符放在同一列中是不明智的,因爲您已經發現並且因爲它阻止您強制執行該數據類型是正確的。

    最後,考慮您是否確實需要排序查詢,排序通常僅用於顯示目的或將某些業務邏輯應用於排序數據集的「頂部」N個元素。

  • +0

    如果在CASE表達式中求值的第一個'column_name'不是一個數字,那麼'CASE'生成的'NULL'將是一個「string」NULL。如果後面有一個「數字」,「CASE」會產生一個數字,運行時會發出錯誤。您需要將'else cast(null as number)'添加到CASE表達式中以防止出現這種情況。 – mathguy

    +0

    你能證明@mathguy?我已經測試過這個,甚至用子表達式'(select * from table_name order by column_name desc)'替換'table',以強制你正在談論的情況。有謂謂推動的小危險,是的,但添加演員陣容並不一定有幫助。 – Ben

    +0

    嗯...我收回。我只是對它進行了測試,似乎並不像我想的那樣。我過去遇到過這個問題,可能是用'UNION',所以我認爲這在所有類似情況下都會成爲問題。無論如何,您的解決方案按原樣運行。 – mathguy