Microsoft SQL 2005中的自然(人類字母數(shù)字)排序我們有一個大型數(shù)據(jù)庫,我們有數(shù)據(jù)庫端分頁。這很快,在幾分之一秒內(nèi)從數(shù)百萬條記錄中返回50行的頁面。用戶可以定義自己的排序,基本上選擇要排序的列。列是動態(tài)的 - 一些具有數(shù)值,一些日期和一些文本。雖然大多數(shù)按預期文本排序是愚蠢的。嗯,我說愚蠢,它對計算機有意義,但讓用戶感到沮喪。例如,按字符串記錄ID排序會產(chǎn)生如下內(nèi)容:rec1
rec10
rec14
rec2
rec20
rec3
rec4...等等。我希望這個考慮到這個數(shù)字,所以:rec1
rec2
rec3
rec4
rec10
rec14
rec20我無法控制輸入(否則我只是在前導000中格式化)而且我不能依賴單一格式 - 有些類似于“{alpha code} - {dept code} - {rec id}”。我知道在C#中有幾種方法可以做到這一點,但是不能下拉所有記錄來對它們進行排序,因為這樣做會很慢。有誰知道在Sql server中快速應用自然排序的方法?我們正在使用:ROW_NUMBER() over (order by {field name} asc)然后我們就這樣分頁。我們可以添加觸發(fā)器,但我們不會。他們所有的輸入都是參數(shù)化的,但是我無法改變格式 - 如果他們輸入“rec2”和“rec10”,他們希望它們就像那樣,以自然的順序返回。我們有有效的用戶輸入,遵循不同客戶的不同格式。有人可能會去rec1,rec2,rec3,... rec100,rec101而另一個可能會去:grp1rec1,grp1rec2,... grp20rec300,grp20rec301當我說我們無法控制輸入時,我的意思是我們不能強迫用戶更改這些標準 - 它們有一個像grp1rec1的值,我不能將其重新格式化為grp01rec001,因為這將改變用于查找和鏈接到外部系統(tǒng)。這些格式變化很大,但通常是字母和數(shù)字的混合。在C#中對它們進行排序很容易 - 只需將其分解{ "grp", 20, "rec", 301 },然后依次比較序列值。但是,可能有數(shù)百萬條記錄并且數(shù)據(jù)被分頁,我需要在SQL服務器上進行排序。SQL服務器按值排序,而不是比較 - 在C#中我可以將值拆分為比較,但在SQL中我需要一些邏輯(非??欤┇@得一致排序的單個值。@moebius - 你的答案可能會有效,但是為所有這些文本值添加排序鍵確實感覺像是一個丑陋的妥協(xié)。
Microsoft SQL 2005中的自然(人類字母數(shù)字)排序
泛舟湖上清波郎朗
2019-08-19 14:11:55