排序列包含数字和字母数字值时,SQL排序失败

时间:2014-11-23 08:55:46

标签: sql ms-access

我尝试按字段排序,可能包含数字或字母后跟数字。 (但不是两者的混合)。

我的排序升序字段是

 sField: IIf(Val([AlbumTrack]) > 0, CInt([AlbumTrack]), [AlbumTrack])

但是数字没有正确排序。字母和数字似乎是。我做错了什么?

数据的例子是7,8,9,10,11 A3,A4,A5,B1,B2,C1

我的sql是

SELECT DISTINCTROW 
    CDTracks.AlbumCat, CDTracks.AlbumTrack, 
    IIf(Val([AlbumTrack])>0,CInt([AlbumTrack]),[AlbumTrack]) AS sField
FROM 
    CDTracks
WHERE 
    (((CDTracks.AlbumCat) = "RCA Victor LSP 2525"))
ORDER BY 
    IIf(Val([AlbumTrack]) > 0, CInt([AlbumTrack]), [AlbumTrack]);

2 个答案:

答案 0 :(得分:2)

嗯,我明白你的意思了。问题似乎是ORDER BY子句中的表达式没有一致的数据类型:对于某些行,它将计算为Integer,而对于其他行,它将计算为String。

以下对我有用,因为此ORDER BY子句中的表达式始终返回String:

SELECT DISTINCTROW
    CDTracks.AlbumCat, CDTracks.AlbumTrack
FROM 
    CDTracks
WHERE 
    (((CDTracks.AlbumCat) = "RCA Victor LSP 2525"))
ORDER BY 
    IIf(Val([AlbumTrack]) > 0, Right("00000" & [AlbumTrack], 5), [AlbumTrack]);

答案 1 :(得分:1)

如果我正确理解了您的问题,此查询将按您想要的顺序返回行:

SELECT DISTINCTROW 
    CDTracks.AlbumCat, CDTracks.AlbumTrack
FROM 
    CDTracks
WHERE 
    CDTracks.AlbumCat = "RCA Victor LSP 2525"
ORDER BY
  IIf(Val([AlbumTrack]) > 0, Null, Left([AlbumTrack], 1)),
  IIf(Val([AlbumTrack]) > 0, CInt([AlbumTrack]), CInt(MID([AlbumTrack], 2)));

这会将AlbumTrack列拆分为两个不同的列:一个用于字母数字部分(如果存在),一个用于数字部分。