缩短查询时间并进行优化

问题描述 投票:1回答:1

我有很多关键词我需要过滤。有没有办法让下面的查询更短?

我需要找到包含以下关键词的字段。我可以使用任何不同的方式,只要我可以做同样的事情。随着时间的推移,我希望能有更多的关键词。

IIf([2CP].[commodity description] Like ('*SCRAP*') 
Or [2CP].[commodity description] Like ('*PART*') 
Or [2CP].[commodity description] Like ('*MIL*') 
Or [2CP].[commodity description] Like ('*Material*') 
Or [2CP].[commodity description] Like ('*PTS*') 
Or [2CP].[commodity description] Like ('*SDDC*') 
Or [2CP].[commodity description] Like ('*SEAT*') 
Or [2CP].[commodity description] Like ('*FOOD*') 
Or [2CP].[raw_cmd_desc] Like ('*SCRAP*') 
Or [2CP].[raw_cmd_desc] Like ('*PART*') 
Or [2CP].[raw_cmd_desc] Like ('*MIL*') 
Or [2CP].[raw_cmd_desc] Like ('*Material*') 
Or [2CP].[raw_cmd_desc] Like ('*PTS*') 
Or [2CP].[raw_cmd_desc] Like ('*SDDC*') 
Or [2CP].[raw_cmd_desc] Like ('*SEAT*') 
Or [2CP].[raw_cmd_desc] Like ('*FOOD*') 
Or [2CP].[raw_cmd_desc] Like ('*lorries motorcycles bicycles Foods*') 
Or [2CP].[raw_cmd_desc] Like ('*lorries*') 
Or [2CP].[shipper name] Like ('*SCRAP*') 
Or [2CP].[shipper name] Like ('*PART*') 
Or [2CP].[shipper name] Like ('*MIL*') 
Or [2CP].[shipper name] Like ('*SDDC*')
Or [2CP].[shipper name] Like ('*FOOD*')
Or [2CP].[shipper name] Like ('*Hoegh*')
Or [2CP].[shipper name] Like ('*NYK*')
,1,0)
sql ms-access-2010
1个回答
0
投票

考虑一个VBA用户定义函数,它接收字段值作为参数,并循环遍历所有关键字的表列表(没有星号)。美丽也是如果存在至少一个True,则方法退出循环和函数,并且不需要检查所有其他值。

VBA功能(保存在标准模块中)

Public Function FindString(commodityParam As String, raw_cmdParam As String, shipperParam As String) As Boolean

    Dim rst As Recordset
    Dim tmp As Boolean

    Set rst = CurrentDb.OpenRecordset("SELECT keyword FROM KeyWordsTable")

    Do While Not rst.EOF            
        If commodityParam Like "*" & rst!keyword & "*" _
            Or raw_cmdParam Like "*" & rst!keyword & "*" _
            Or shipperParam Like "*" & rst!keyword & "*" Then

            tmp = True
            GoTo ExitFunction
        End If

        rst.MoveNext
    Loop

ExitFunction:
    rst.Close
    Set rst = Nothing
    TestLoop = tmp

End Function

SQL(VBA函数可用于任何SQL查询)

-- SELECT WITH CALCULATED COLUMN
SELECT *, FindString([commodity description], [raw_cmd_desc], [shipper name]) As Output
FROM [2CP];

-- SELECT WITH WHERE CONDITION
SELECT * FROM [2CP]
WHERE FindString([commodity description], [raw_cmd_desc], [shipper name]) = True;

-- APPEND QUERY
INSERT INTO (ID, BooleanValue)
SELECT ID, FindString([commodity description], [raw_cmd_desc], [shipper name])
FROM [2CP];

-- UPDATE QUERY
UPDATE [2CP]
SET BooleanValue = FindString([commodity description], [raw_cmd_desc], [shipper name]);

-- DELETE QUERY
DELETE FROM [2CP]
WHERE FindString([commodity description], [raw_cmd_desc], [shipper name]) = TRUE;
© www.soinside.com 2019 - 2024. All rights reserved.