0

我的表中有一个名为“regnr”的列,其值为两个字母(如果达到 zz,它将添加一个字母并从 aaa 开始),后跟数字 1-256。

我必须在此列中找到一个范围让我们说“ba50”到“bc28”

我尝试使用WHERE 'regnr' >= "ba50" AND 'regnr <= "bc25"

这不包括“ba”范围内以 1 到 4 开头的数字,因此不会显示 100+。当它到达'bb'时,它会显示所有内容,而一旦它到达'bc',它只会显示它应该显示的一部分。bc 仅显示“BC10”、“BC11”和“BC2”,即使数据库中有注册号 BC1 到 BC25。

4

1 回答 1

1

如果您使用您的 MS Access 数据库作为前端,这意味着您不从另一个应用程序连接到它,您可以使用用户定义的功能来解决这个问题。

您可以在 MS Access 环境中的模块中定义这样的功能。

我建议创建一个函数,将 regnr 值拉伸为固定长度格式,其中字母占据前 4 个字符,数字占据最后 8 个字符,以得到一个 12 个字符的字符串,该字符串可通过标准不等式运算符进行比较. 例如,如果您给该函数一个值“bc25”,它将返回“aabc00000025”

这是执行此操作的函数:

Public Function MakeLong(ByVal regno As String) As String
    Dim letters As String

    ' Extract the letters from regno
    Do While regno >= "a"
        letters = letters & Left(regno, 1)
        regno = Mid(regno, 2)
    Loop
    ' Left-pad letters with "a" to 4 characters, and
    ' left-pad number with "0" to 8 digits, and concatenate:
    MakeLong = Right("aaaa" & letters, 4) & Right("0000000" & regno, 8)
End Function

然后在您的查询中,您可以编写:

WHERE MakeLong('' & regnr) BETWEEN MakeLong("ba50") AND MakeLong("bc25")

如果您希望字母部分占用超过 4 个字符,或者数字部分超过 8 个,您可以相应地调整此函数以返回更长的字符串。

请注意,通过这种 UDF 的使用,您不会从表上的任何索引中受益,因此如果您有很多记录,性能可能会变得非常糟糕。

如果这成为一个问题,我建议尽可能为您的 regnr 列使用不同的编码格式。

于 2015-10-31T14:22:23.027 回答