2013-07-27 41 views
1

我在PostgreSQL 9.0中有一個數據庫,它有一個帶有字符串字段的表來存儲客戶端代碼。 這些代碼是字母數字,並且可以以字母或數字開頭,例如1, 2, A0001-4, A0001-2, 10如何按數字先查詢然後按字符串在同一字段

我要訂購由串數字,然後再爲了像

1, 2, 10, A0001-2, A0001-4 

我這樣做有to_number(fields, '99999999'),例如:

SELECT * FROM empleados ORDER BY to_number(legajo, '99999999'), legajo 

但是當代碼是've',沒有數字時,查詢失敗。

我該怎麼辦?

回答

1

您可以使用一個case語句來找到號碼:

select * 
from empleados 
order by (case when legajo not similar to '%[^0-9]%' then 1 else 0 end) desc, 
     (case when legajo not similar to '%[^0-9]%' then to_number(legajo, '999999999') end), 
     legjo; 

similar to表達是說,所有的字符是數字。

編輯:

修復了語法錯誤。你可以測試這個:

with empleados as (
     select 'abc' as legajo union all 
     select '123' 
    ) 
select * 
from empleados 
order by (case when legajo not similar to '%[^0-9]%' then 1 else 0 end) desc, 
     (case when legajo not similar to '%[^0-9]%' then to_number(legajo, '999999999') end), 
     legajo; 

SQLFiddle是here

+0

不起作用,顯示我附近的case語句錯誤。謝謝 – Aegis

0

試試這個:

select * 
from empleados 
order by 
    case 
     when legajo similar to '%[0-9]%' then to_number(legajo, '999999999') 
     else 999999999 
    end, 
    legajo 

sql fiddle demo

相關問題