PALMisLIFE 討論區

標題: [求助] SQL語法 [列印本頁]

作者: johnnyk    時間: 2005-8-17 16:03
標題: [求助] SQL語法
資料表 Table1
欄位 a1,a2,都是varchar

  a1 a2
1 100 200
2 90
3 200 70
4 300 120
5 1200

目標是:只要a2有數值的,就先以a2排序 (a2無內容的是空字串,非Null)
當a2排序完後,再以a1排序,結果要像下面這樣

  a1 a2
3 200 70
4 300 120
1 100 200
2 90
5 1200

原本應該是很簡單的,不過不幸的是,這兩個欄位都是varchar
varchar欄位在 order by 排序下的順序會是
a2:空字串、空字串、120、200、70
a1:100、1200、200、300、90

a1好解決:select * from Table1 order by convert(numeric,a1)
a2就慘了,空字串不能轉型為數值,會發生error

想請問,除了改變欄位型態外,還有沒有其他select語法可以達成我要的排序?
作者: jiahorng    時間: 2005-8-17 16:26
標題: Re: [求助] SQL語法
這個看起來好像是MSSQL的!
用Oracle的話可以用decode判別是不是空字串,把空字串轉成0然後排序。
作者: chengru    時間: 2005-8-17 17:04
標題: Re: [求助] SQL語法
SELECT CAST((CASE WHEN A ='' THEN B ELSE A END) AS INTEGER) C FROM TABLE 1
ORDER BY C

B可以設為接近0的integer

Try to see if this works. Use Case.. When in Cast.
作者: johnnyk    時間: 2005-8-17 17:25
標題: Re: [求助] SQL語法
Originally posted by jiahorng at 2005-8-17 16:26:
這個看起來好像是MSSQL的!
用Oracle的話可以用decode判別是不是空字串,把空字串轉成0然後排序。


沒錯就是MSSQL

剛剛跟同事討論出來了,也執行正確無誤
SELECT * FROM Table1  order by (case when a2='' then 9999999 else convert(numeric,a2) end ),convert(numeric,a1)
作者: johnnyk    時間: 2005-8-17 17:28
標題: Re: [求助] SQL語法
Originally posted by chengru at 2005-8-17 17:04:
SELECT CAST((CASE WHEN A ='' THEN B ELSE A END) AS INTEGER) C FROM TABLE 1
ORDER BY C

B可以設為接近0的integer

Try to see if this works. Use Case.. When in Cast.



感謝chengru指導,這個方法也不錯的樣子,等等也來試一下




歡迎光臨 PALMisLIFE 討論區 (http://f.pil.tw/) Powered by Discuz! X2.5