2012-04-05 56 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