2

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

    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() 相反的函数,但找不到它。有任何想法吗?谢谢!

4

2 回答 2

3

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

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

基本上,用VAL在文本中查找数字,然后用空格替换它,并修剪其余部分。

于 2012-12-05T19:08:59.830 回答
1

您需要一个简单的函数,如 inverse ofVal()来丢弃所有非字母字符。我不知道这样的事情。但是,基于正则表达式的解决方案很容易。下面的函数丢弃所有不是字母的字符。这是应用于您的一些示例输入的函数。

? 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对象会被创建一次,然后重新用于以后对函数的调用。在对象创建期间早期绑定的任何速度优势都应该是无关紧要的。

于 2012-12-05T19:22:57.550 回答