正确的功能,没有返回预期的?

时间:2010-09-28 12:02:31

标签: sql ms-access

查询:

SELECT StartDate, EndDate, RIGHT(Sector, 1 )
FROM Table1
ORDER BY Right(Sector, 1), StartDate

通过查看此信息,查询应按扇区排序,然后是开始日期。这个查询已经安静了一段时间,直到昨天没有正确排序,出于某种原因,第2区出现在第1区之前。

Sector的数据类型是int类型,而不是null。将TRIM函数插入Sector之后,它似乎工作正常。

新查询:

SELECT StartDate, EndDate, RIGHT(Sector, 1 )
FROM Table1
ORDER BY Right(TRIM(Sector), 1), StartDate

我觉得这很奇怪,因为它假设只选出一个字符,为什么还有前导空格?

在转换类型之前在int上使用RIGHT函数是否存在问题?还是别的什么?

感谢大家的帮助!

-Edit- RIGHT函数应返回1,2,3或4,但在订购时,2则在1之前。

为了澄清,列Sector包含一个int值,我们可以通过获取最后一位数来确定它的位置(这就是前一个编码器所做的)

3 个答案:

答案 0 :(得分:3)

MS Access 2003有一个奇怪的小功能(我不能代言其他版本):

  1. 进行简单查询。按列A 升序排序。保存查询。
  2. 运行查询。当您看到输出时,使用工具栏选项按列A 降序排序(请参见下面的图片)。保存&关闭。
  3. 再次运行查询。您的新排序将覆盖您在查询中保存的排序。
  4. 我认为您或其他人可能只是出于好奇心打开了查询,按扇区降序排序,当提示您保存设计更改时,您选择了是(尽管从技术上讲您没有做任何事)。我发现恢复原始排序的最简单方法是编辑查询并保存。

    alt text

答案 1 :(得分:3)

如果您需要对数字字段的子字符进行排序,则表明您的数据存储错误。

也就是说,在某些上下文中,VBA函数在符号的数字的字符串表示中保留一个空格。一个荒谬的例子是:

  ?Len("12345")
   5 

注意开头的空格(如果Len()返回的数字可能为负数,则为 - 。我认为这是将数字强制转换为字符串值的结果,但不是这样,我无法复制问题。但这可能是问题的根源,当然,削减领先空间会解决问题。

但这是每行的两个函数调用,然后你按它排序,这意味着没有使用索引,所以相对于可以使用索引的SORT BY来说它会变慢。所以,我得出结论你有一个模式错误,因为你给字段中存储的数据的子部分赋予了意义。

答案 2 :(得分:1)

看起来非常明显的是,扇区字段的末尾有一个空白区域,即裁剪正在移除。