首页 > 解决方案 > 查询表达式vba访问中的表达式太复杂

问题描述

来自stackoverflow的朋友你好

我遇到了访问和 sql 的问题,请在我的查询下方找到

update finaldata set [Area]=
IIF(InStr(1,[Name],'PoolSide',1)<>0,'PoolSide',
IIF(InStr(1,[Name],'Mountainside',1)<>0,'Mountainside',
IIF(InStr(1,[Name],'Garden Area',1)<>0,'Garden Area',
IIF(InStr(1,[Name],'Ground Floor',1)<>0,'Ground Floor',
IIF(InStr(1,[Name],'Annex Building',1)<>0,'Annex Building',
IIF(InStr(1,[Name],'Beachside',1)<>0,'Beachside',
IIF(InStr(1,[Name],'Beachfront',1)<>0,'Beachfront',
IIF(InStr(1,[Name],'Mountainside',1)<>0,'Mountainside',
IIF(InStr(1,[Name],'Executive',1)<>0,'Executive Level',
IIF(InStr(1,[Name],'Lakeside',1)<>0,'Lakeside',
IIF(InStr(1,[Name],'Mezzanine',1)<>0,'Mezzanine',
IIF(InStr(1,[Name],'Oceanfront',1)<>0,'Oceanfront',
IIF(InStr(1,[Name],'Overwater',1)<>0,'Overwater,
IIF(InStr(1,[Name],'Slope side',1)<>0,'Slope side',
IIF(InStr(1,[Name],'Tower',1)<>0,'Tower,'Delete'
)))))))))))))))

我有 10 万条记录,我不想使用记录集,它需要太长时间,我已经尝试过了。我有很多内部连接,而且我的数据库文件越来越大。

我有哪些处理字符串的选项?我有一个长长的字符串存储在 [Name] 中,具有房间的许多特征。我试图破译这个名字。

如果我唯一的选择是记录集,那么处理嵌套的 if 或 select 案例会更快吗?

感谢您的时间和帮助

标签: sqlvbams-access

解决方案


如评论中所述,您当前的代码缺少几个单引号来终止您正在测试的字符串,并且最好使用单个switch语句而不是多个嵌套iif语句编写,例如:

update finaldata set [area] = 
switch
(
    instr([name],'PoolSide')<>0,'PoolSide',
    instr([name],'Mountainside')<>0,'Mountainside',
    instr([name],'Garden Area')<>0,'Garden Area',
    instr([name],'Ground Floor')<>0,'Ground Floor',
    instr([name],'Annex Building')<>0,'Annex Building',
    instr([name],'Beachside')<>0,'Beachside',
    instr([name],'Beachfront')<>0,'Beachfront',
    instr([name],'Mountainside')<>0,'Mountainside',
    instr([name],'Executive')<>0,'Executive Level',
    instr([name],'Lakeside')<>0,'Lakeside',
    instr([name],'Mezzanine')<>0,'Mezzanine',
    instr([name],'Oceanfront')<>0,'Oceanfront',
    instr([name],'Overwater')<>0,'Overwater',
    instr([name],'Slope side')<>0,'Slope side',
    instr([name],'Tower')<>0,'Tower',
    true,'Delete'
)

在性能方面instr,您可能会发现使用运算符更快,而不是重复使用该函数,该函数返回有关字符串中子字符串的不必要位置数据like,例如:

update finaldata set [area] = 
switch
(
    [name] like '*PoolSide*','PoolSide',
    [name] like '*Mountainside*','Mountainside',
    [name] like '*Garden Area*','Garden Area',
    [name] like '*Ground Floor*','Ground Floor',
    [name] like '*Annex Building*','Annex Building',
    [name] like '*Beachside*','Beachside',
    [name] like '*Beachfront*','Beachfront',
    [name] like '*Mountainside*','Mountainside',
    [name] like '*Executive*','Executive Level',
    [name] like '*Lakeside*','Lakeside',
    [name] like '*Mezzanine*','Mezzanine',
    [name] like '*Oceanfront*','Oceanfront',
    [name] like '*Overwater*','Overwater',
    [name] like '*Slope side*','Slope side',
    [name] like '*Tower*','Tower',
    true,'Delete'
)

鉴于这是对整个数据集进行操作,并且在执行时每条记录最多可以执行 15 次比较,因此评估 16 个单独的查询可能会更快,每个查询具有以下结构:

update finaldata set [area] = 'PoolSide' where [name] like '*PoolSide*'

推荐阅读