我正在使用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“参数的查找表.这有可能吗??
发布于 2013-10-13 22:44:49
那么,一个更通用的版本--越依赖于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-13 21:47:46
(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.IDhttps://stackoverflow.com/questions/19349588
复制相似问题