2012-04-05 62 views
4

我需要從Delphi XE2下的現有Padadox數據庫提取數據(是的,我將它們分成了10多年)。由包含數字和字母的字段排序

我需要根據包含如'1','2 a','100','1b','50 bis'等值的字段(示例中的id)對結果進行排序...而得到這個:

- 1 
- 1 b 
- 2 a 
- 50 bis 
- 100 

也許類似的東西可以做到這一點,但這些關鍵字不存在:

SELECT id, TRIM(TRIM(ALPHA FROM id)) as generated, TRIM(TRIM(NUMBER FROM id)) as generatedbis, etc 
FROM "my.db" 
WHERE ... 
ORDER BY generated, generatedbis 

我怎麼能取得這樣的排序與矛盾...?

回答

7

試試這個:用食鹽的完整罐子

SELECT id, CAST('0' + id AS INTEGER) A 
FROM "my.db" 
ORDER BY A, id 
+0

SELECT id,CAST(id AS INTEGER)...更簡單,並且做到了!謝謝你的啓發! – Darkendorf 2012-04-05 15:35:32

+2

是的,它更簡單。我的想法是,'0'+'將處理'id'爲空或第一個字符爲Alpha的情況。顯然它不是必需的。很高興我能幫上忙。 – kobik 2012-04-05 15:50:50

+0

很好想過^^事實上,如果第一個字符是阿爾法,投射爲int返回0 - 或null我真的不在乎 - 它是按我的需要訂購! a,b,1,1b,12,100 bis ...再次感謝! – Darkendorf 2012-04-05 15:54:24

1

這些想法映入腦海:

  1. 創建德爾福,做那種客戶端,使用重新排列串入的東西是compariable,也許lexographically比較/製圖功能的排序功能。

  2. 添加到其數據要排序表中的列,包含可與標準的字符串比較來比較,這樣將與治安工作BY

  3. 值的修改添加存儲功能修改值的悖論,並在ORDER BY子句中使用此函數。

被修改,我的意思是這樣,字符串分隔成組件,以及每個組件右側填充足夠的空間重新加入他們的行列,使所有的組件都是在字符串中的相同位置。如果您可以放心地說,對於每個組件,數據庫中的值都不會超過特定的長度,這隻會可靠地工作。

我對這些建議很少/沒有悖論或delphi的知識,所以你將不得不採取我的建議一粒鹽。

+1

我挺搶想法... 3.似乎有趣,但如果你能提供給我,可以給我正確的方向的樣本,它可以更加方便^^ – Darkendorf 2012-04-05 13:29:17