我有一张桌子,我正在尝试排序并遇到一些困难。它是一个序列列,用于表示分层数据,自动排序如下所示:
SEQUENCE
1
1.1
1.10
1.2
1.3
...
2
2.1
相反,我需要排序:
SEQUENCE
1
1.1
1.2
...
1.10
2
2.1
它位于MS Access中,它是一个本地(临时)表,因此我无法访问hierarchyID或任何其他很酷的MS-SQL工具。此外,序列没有固定的级别,所以我不能轻易地将它们分成列。有任何想法吗?
澄清:序列没有固定的级别,并不局限于两个部分。它通常是5+(例如1.1.1.1.1)。
您可以在主版本和次版本之间拆分值,将它们转换为数字,然后按两者排序。
但是,在Access SQL中拆分很难。如果您要使用3部分或更多部分版本号,我建议您使用VBA。
SELECT Sequence
FROM MyTable
ORDER BY
CInt(IIF(Sequence LIKE "*.*", Left(SEQUENCE, Instr(1, SEQUENCE, ".")-1)),
IIF(IsNumeric(Right(Sequence, Len(SEQUENCE) - Instr(1, SEQUENCE, "."))), CINT(Right(Sequence, Len(SEQUENCE) - Instr(1, SEQUENCE, "."))) ,0))
对于两部分层次结构值,您可以使用以下内容:
SELECT Sequence
FROM MyTable
ORDER BY Int(Sequence), Int(Replace(Sequence,".","0"));
您可以使用Val通过这个花哨的表达式订购:
Int(Val([Sequence])), Val(Mid([Sequence], 1 + Len(Str(Int(Val([Sequence]))))))
它也适用于9以上的段落:
1
1.1
1.2
...
1.10
2
2.1
...
10.0
10.11
因为我仅限于MS Access SQL功能,并且序列不限于两部分结构,所以我最终采用June7的建议,在我制作表时只添加零,这样它只需使用简单的方法就可以正确排序订购。
谢谢大家的帮助。