第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Microsoft SQL 2005中的自然(人類字母數(shù)字)排序

Microsoft SQL 2005中的自然(人類字母數(shù)字)排序

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é)。
查看完整描述

3 回答

?
絕地無雙

TA貢獻1946條經(jīng)驗 獲得超4個贊

order by LEN(value), value

不完美,但在很多情況下效果很好。


查看完整回答
反對 回復 2019-08-19
?
開心每一天1111

TA貢獻1836條經(jīng)驗 獲得超13個贊

我知道這是一個老問題,但我剛剛遇到它,因為它沒有得到一個公認的答案。

我總是使用類似的方式:

SELECT [Column] FROM [Table]ORDER BY RIGHT(REPLICATE('0', 1000) + LTRIM(RTRIM(CAST([Column] AS VARCHAR(MAX)))), 1000)

唯一常見的問題是,如果您的列不會轉換為VARCHAR(MAX),或者LEN([Column])> 1000(但如果您愿意,可以將1000更改為其他內(nèi)容),但是可以根據(jù)您的需要使用這個粗略的想法。

這也是比正常的ORDER BY [Column]更糟糕的性能,但它確實為你提供了OP中要求的結果。

編輯:只是為了進一步說明,如果您有十進制值,例如有1,1.151.5(它們將排序為{1, 1.5, 1.15}),則上述將不起作用,因為這不是OP中要求的,但可以通過以下方式輕松完成:

SELECT [Column] FROM [Table]ORDER BY REPLACE(RIGHT(REPLICATE('0', 1000) + LTRIM(RTRIM(CAST([Column] AS VARCHAR(MAX)))) + REPLICATE('0', 100 - CHARINDEX('.', REVERSE(LTRIM(RTRIM(CAST([Column] AS VARCHAR(MAX))))), 1)), 1000), '.', '0')

結果: {1, 1.15, 1.5}

而且仍然完全在SQL中。這不會對IP地址進行排序,因為您現(xiàn)在正在進入非常具體的數(shù)字組合,而不是簡單的文本+數(shù)字。


查看完整回答
反對 回復 2019-08-19
  • 3 回答
  • 0 關注
  • 744 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號