2015-10-31 45 views
0

我的表中有一個名爲'regnr'的列,其值是兩個字母(如果它到達zz它將添加一個字母並從aaa開始),然後是數字1-256。如何在由2個字母和數字組成的SQL(訪問)中選擇一個範圍(最多256個)

我必須找到在此列的範圍可以說「ba50」到「bc28」

我嘗試使用WHERE 'regnr' >= "ba50" AND 'regnr <= "bc25"

這不包括在「把」範圍,以100開頭的1至4號+沒有顯示出來。當它到達'bb時,它顯示所有內容,一旦達到'bc',它只顯示它應該顯示的部分內容。 bc僅顯示數據庫中的註冊編號BC1至BC25,即「BC10」,「BC11」&「BC2」。

+0

您的前端應用程序是否是MS Access文件本身,還是您從其他應用程序連接到它? – trincot

回答

1

如果您使用MS Access數據庫作爲前端,這意味着您沒有從另一個 應用程序連接到它,您可以使用用戶定義的功能來解決此問題。

您可以在MS Access環境的模塊中定義這樣的功能。

我建議創建延伸 格式, 其中字母佔據前4個字符和數字的最後8,在12個字符的字符串到達​​ 的regnr值以固定長度的一個函數,它通過標準的不平等運營商是可比的。 因此,舉例來說,如果你想給這個函數的「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列。

+0

有點奇怪,但我不得不把它作爲'在哪裏MakeLong('&regnr)...'來讓它工作。到目前爲止,該功能似乎已經解決了我的問題,但謝謝。 – Noax

+0

不客氣。我已經把你的版本放在答案中。謝謝。 – trincot

相關問題