如何从SQL / Access中的字符串中仅检索字母数字?

时间:2012-12-05 19:00:52

标签: ms-access

我有一个列必须从数字和空格中清除,如下所示:

    XX = 
TERR
6 ST
3 ST
4 ST
 AVE
2 PL
2 PL
2 PL
2 PL
4 CT
2 PL
4 ST
3 ST
3 ST

我的意思是,我需要与Val()相反的功能,但找不到它。有任何想法吗? 谢谢!

2 个答案:

答案 0 :(得分:3)

确实没有这方面的功能,但只要您的所有文字都采用 NUMBER TEXT TEXT 格式(而不是 NUMBER TEXT NUMBER ),您可以使用以下内容:

TRIM(Replace(Column, VAL(Column), '')) AS Result

基本上,使用VAL查找文本中的数字,然后将其替换为空格,然后修剪其余部分。

答案 1 :(得分:1)

你想要一个像Val()的逆的简单函数来丢弃所有非字母字符。我什么都不知道。但是,基于正则表达式的解决方案很容易。下面的函数丢弃所有非字母的字符。以下是适用于某些示例输入的函数。

? OnlyAlpha("TERR")
TERR
? OnlyAlpha("6 ST")
ST
? OnlyAlpha(" AVE")
AVE

您需要在Access应用程序会话中使用此功能。在从Access外部运行的查询中使用它时将无法使用...如来自经典ASP,VBScript,Dot.Net等。

Public Function OnlyAlpha(ByVal strSource As String) As String
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    re.Global = True
    re.IgnoreCase = True
    re.pattern = "[^a-z]"
    OnlyAlpha = re.Replace(strSource, vbNullString)
    Set re = Nothing
End Function

评论让我想到了性能,所以我提供这个版本,我相信应该能够更快地执行。

Public Function OnlyAlpha(ByVal strSource As String) As String
    ' early binding requires reference to Microsoft
    ' VBScript Regular Expressions:
    'Static re As RegExp
    ' with late binding, no reference needed:
    Static re As Object

    If re Is Nothing Then
        'Set re = New RegExp ' early binding
        Set re = CreateObject("VBScript.RegExp") ' late binding
        re.Global = True
        re.IgnoreCase = True
        re.pattern = "[^a-z]"
    End If

    OnlyAlpha = re.Replace(strSource, vbNullString)
End Function

您可以轻松地将该代码从后期绑定到早期绑定。早期绑定在开发过程中很有用,因为它允许Intellisense帮助您。在某些情况下,早期绑定可能会明显加快。但是,在这种情况下,RegExp对象被创建一次,然后重新用于以后调用该函数。在对象创建过程中,早期绑定的任何速度优势应该是无关紧要的。