排序文本字段

问题描述:

我有以下的纪录,需要给他们相应的分类:排序文本字段

AB*1 
AB*2 
AB*10 
AB*100 

我使用下面的SQL语句,其完美的作品,但仅限于被过滤特定条件的记录。

SELECT  Column1 
FROM  dbo.Table1 
ORDER BY LEN(Column1), Column1 
WHERE Column1 Like 'AB*' 

当我删除了Where子句中的例子中,记录AB * 100下方出现一路下滑。明显的是,它将所有记录与长度为4的组合在一起,然后从长度为5的记录开始全部重复,等等。

在将星号分组在一起并排序正确之前,是否可以对这些命令进行排序?

+0

星号前总是2个字符? – 2012-03-16 13:33:30

+0

可悲的是,没有。也。在星号之后,大部分是数字,但很少是字母数字(例如1A,2A等)。 – Rick 2012-03-16 13:37:06

+0

请给出更多的异构输入和期望的输出。你想在Access中这个? – 2012-03-16 13:41:34

这很可能是缓慢的:使用

ORDER BY Mid(Column1,1,Instr(Column1,"*")) 

编辑再评论

SELECT Column1 
FROM Table 
ORDER BY Mid([Column1],1,InStr([Column1],"*")), 
     Val(Mid([Column1],InStr([Column1],"*")+1)); 

的样本数据在测试中:

ID 
ab*1 
ab*10 
ab*2 
abcdef*a1 
abcdef*10 
abcdef*40a 

对于空值,只需添加几个零长度的字符串。

SELECT column1 
FROM Table 
ORDER BY Mid([column1] & "",1,InStr([column1] & "","*")), 
     Val(Mid([column1] & "",InStr([column1] & "","*")+1)); 
+0

不慢,但产生以下顺序:AB * 1,AB * 12,AB * 14,AB * 10,AB * 11,AB * 13,AB * 5,AB * 2 ... – Rick 2012-03-20 14:54:46

+0

请尝试以下操作: ORDER BY Mid(Column1,1,Instr(Column1,“*”))ASC,Mid(Column1,InStr(Column1,“*”)+ 1,Len(Column1))ASC,但在条件表达式中得到“数据类型不匹配“ 错误信息。我的想法是尝试在星号之后排序,然后是一些字母。 – Rick 2012-03-20 15:00:25

+0

嗨@瑞克,我不太清楚你想要什么。我已经添加了一个注释。 – Fionnuala 2012-03-20 15:05:35

看来这会做你想要什么,除非我误解

SELECT  Column1 
FROM  dbo.Table1 
ORDER BY left(Column1,2), LEN(Column1) 

“按字母顺序排列”的第一个字符实际上是“无字符”。所以它不是“一串4先来”。例如,以下是为了...

AB*1 
AB*2 
AB*10 
AB*100 
CD*1 
CD*2 
CD*10 
CD*100 

可能顺序由前3个字符的字符串,并且后的字符为数字。只要是你的数据的行为......

ORDER BY 
    LEFT(column1, 3), 
    CLNG(MID(column1, 4, 8000)) 

,或者你可以拉长你的价值观,责令仿佛他们看上去像这样...

AB*100 
AB*10Z 
AB*1ZZ 
AB*2ZZ 

使用这种ORDER BY的声明...

ORDER BY 
    column1 & string(8000 - LEN(column1), "z") 


但是,这些都是强制“非自然”排序的解决方法,因为目前您正在获得“正确”排序。

+0

您如何看待CAST使用MS Access? (SQL是一个通用的标签。) – Fionnuala 2012-03-16 14:03:53

+0

@Remou - 卫生署,我查了'padright()'equivilent,而不是演员。它应该是... *''CLNG()'* – MatBailie 2012-03-16 14:07:23

+0

在这两个示例中,我都会收到错误:“表达式中的数据类型不匹配标准”。在星号之前没有固定长度,可以是一个字符或四个字符。 – Rick 2012-03-20 15:05:37