2013-02-05 100 views
1

我希望值的順序與列名PTNT_VST_CSNO從下面的轉換:與SQL Server自然排序

VMIP1 
VMIP10 
VMIP11 
VMIP2 
VMIP20 
VMIP21 
VMIP3 
VMIP31 
VMIP32 
VMIP5 
VMIP6 
VMIP7 
VMIP8 
VMIP9 
VMOP10 
VMOP11 
VMOP12 
VMOP3 
VMOP30 
VMOP31 
VMOP32 
VMOP4 
VMOP40 
VMOP41 
VMOP42 
VMOP43 
VMOP7 
VMOP70 
VMOP71 
VMOP8 
VMOP9 

到:

VMIP1 
VMIP2 
VMIP3 
VMIP5 
VMIP6 
VMIP7 
VMIP8 
VMIP9 
VMIP10 
VMIP11 
VMIP20 
VMIP21 
VMIP31 
VMIP32 
VMOP3 
VMOP4 
VMOP7 
VMOP8 
VMOP9 
VMOP10 
VMOP11 
VMOP12 
VMOP30 
VMOP31 
VMOP32 
VMOP40 
VMOP41 
VMOP42 
VMOP43 
VMOP70 
VMOP71 

我想要的'數字部分排序vmip',然後是'vmop'..我嘗試了很多,但每次都失敗了。好心幫我傢伙梳理排序問題...預先感謝您

+0

歡迎StackOverflow的:如果您發佈的代碼, XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」),以精確地格式化和語法突出顯示它! –

+0

非常感謝您以適當的格式編輯樣本...今後我會在發佈之前檢查所有這些...請幫助我解決問題...謝謝 – Debs

回答

0

後大考驗,我成功地用下面的方法來解決它..

SELECT ptnt_vst_csno 
FROM table_name 
ORDER BY Substring(ptnt_vst_csno, 1, Charindex('P', ptnt_vst_csno)), 
      CONVERT(INT, Substring(Substring(ptnt_vst_csno, 
           Charindex('P', ptnt_vst_csno), 
           Len( 
               ptnt_vst_csno)), 2, Len( 
         ptnt_vst_csno))) 
1

不是最快的事情在世界上,但它應該完成這項工作:

ORDER BY CASE WHEN PTNT_VST_CSNO LIKE 'vmi%' THEN 0 ELSE 1 END 
     ,CAST(replace(replace(PTNT_VST_CSNO, 'vmip', ''), 'vmop', '') as int) 
+0

嘿,謝謝你,洛特.. – Debs

0

最簡單的方法來做到這一點會將您的數字更改爲3位數字。

即1會變成001,2會變成002,10將成爲010,等等...

這會再允許你正確地對數據進行排序。

你可能想要做這樣的事情:

SELECT 
    PTNT_VST_CSNO, 
    'VMIP' + CASE LEN(REPLACE(PTNT_VST_CSNO, 'VMIP', '')) 
    WHEN 1 THEN '00' + REPLACE(PTNT_VST_CSNO, 'VMIP', '') 
    WHEN 2 THEN '0' + REPLACE(PTNT_VST_CSNO, 'VMIP', '') 
    ELSE REPLACE(PTNT_VST_CSNO, 'VMIP', '') 
    END 
FROM 
    TableName 
WHERE 
    LEFT(PTNT_VST_CSNO, 4) = 'VMIP' 
ORDER BY 
    2