0

我正在使用 access 2007,我需要一个函数来检查文本字段,如果找到某个单词,它将根据查找表返回某个值

例如我有一个文本字段如下:

    ID                   Text
|    1     |  engineers for mechanical work  
|    2     |  engineers for civil work       
|    3     |  engineers for electrical work 

我有如下查找表:

     Checkwords             showords
 |   mechanical      |   mechanical engineer
 |   civil           |   civil engineer
 |   chemical        |   chemical engineer
 |   electrical      |   electrical engineer
 |   maintenance     |   maintenance engineer
 |   electronics     |   electronics engineer

我需要检查文本记录的功能,如果找到“机械”之类的文本,它将显示“机械工程师”,如果找到“土木”之类的文本,它将显示“土木工程师”等

我有大约 200 个单词要检查,所以我需要一个使用带有“like”参数的查找表的函数……这可能吗???

4

2 回答 2

0

好吧,那么,一个更通用的版本,虽然被警告 - 你越依赖 VBA 而不是 SQL,处理大量甚至不那么大量的数据的速度就越慢:

(1) 添加一个类模块,将其命名为 LookupData,并在其中添加以下字段:

Public Key As String
Public Value As String

(2) 在一个标准模块中,定义如下函数:

Function LookupShowWords(ByVal Text)
  If IsNull(Text) Then
    LookupShowWords = Null
    Exit Function
  End If
  Dim Data As LookupData
  Static LookupTable As VBA.Collection
  If LookupTable Is Nothing Then
    Set LookupTable = New VBA.Collection
    Dim RS As DAO.Recordset
    Set RS = CurrentDb.OpenRecordset("LookupTable", dbOpenForwardOnly)
    While Not RS.EOF
      Set Data = New LookupData
      Data.Key = "*" + RS(0) + "*"
      Data.Value = RS(1)
      LookupTable.Add Data
      RS.MoveNext
    Wend
  End If
  Dim S As String
  For Each Data In LookupTable
    If Text Like Data.Key Then
      If Len(S) = 0 Then
        S = Data.Value
      Else
        S = S + ";" + Data.Value
      End If
    End If
  Next
  If Len(S) = 0 Then LookupShowWords = Null Else LookupShowWords = S
End Function

(3) 列出结果的查询现在可以重写为如下所示:

SELECT ID, LookupShowWords(Text) AS ShowWords FROM MainTable ORDER BY ID;

请注意,(2)中的假设是查找表本质上是静态的,在这种情况下,它的内容可以在调用之间安全地缓存。

于 2013-10-13T22:44:49.867 回答
0

(1) 一个自定义的VBA函数来提取关键字:

Function ExtractKeyword(ByVal Text)
  Text = Mid(Text, InStr(Text, " for ") + 5)
  If Right(Text, 5) = " work" Then
    ExtractKeyword = Left(Text, Len(Text) - 5)
  Else
    ExtractKeyword = Text
  End If
End Function

(2) 使用它的查询:

SELECT MainTable.ID, LookupTable.ShowWords
FROM MainTable LEFT JOIN
     LookupTable ON ExtractKeyword(MainTable.Text) = LookupTable.CheckWords
ORDER BY MainTable.ID
于 2013-10-13T21:47:46.600 回答