排序文本字段
我有以下的纪录,需要给他们相应的分类:排序文本字段
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的记录开始全部重复,等等。
在将星号分组在一起并排序正确之前,是否可以对这些命令进行排序?
这很可能是缓慢的:使用
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));
不慢,但产生以下顺序:AB * 1,AB * 12,AB * 14,AB * 10,AB * 11,AB * 13,AB * 5,AB * 2 ... – Rick 2012-03-20 14:54:46
请尝试以下操作: ORDER BY Mid(Column1,1,Instr(Column1,“*”))ASC,Mid(Column1,InStr(Column1,“*”)+ 1,Len(Column1))ASC,但在条件表达式中得到“数据类型不匹配“ 错误信息。我的想法是尝试在星号之后排序,然后是一些字母。 – Rick 2012-03-20 15:00:25
嗨@瑞克,我不太清楚你想要什么。我已经添加了一个注释。 – 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")
但是,这些都是强制“非自然”排序的解决方法,因为目前您正在获得“正确”排序。
星号前总是2个字符? – 2012-03-16 13:33:30
可悲的是,没有。也。在星号之后,大部分是数字,但很少是字母数字(例如1A,2A等)。 – Rick 2012-03-16 13:37:06
请给出更多的异构输入和期望的输出。你想在Access中这个? – 2012-03-16 13:41:34