我试图在一个表中创建几个计算列,其中包含已解析文件名的不同部分。使用InstrRev函数对于隔离基本文件名或扩展名至关重要,但计算列中不支持InstrRev。
我知道还有其他方法可以解决我的问题,不使用计算列,但有没有人有一个有效的计算列公式,可以帮助我?
答案 0 :(得分:1)
Access允许您直接在SQL查询中使用VBA函数(包括用户定义的函数) - 但是它们只能在Access上下文中工作 - 如果您有另一个JET(现在是ACE)数据库的前端 - 或者在计算机内部/计算专栏,他们不会像你刚刚发现的那样工作。
不幸的是,Access(JET和ACE)只有非常微弱和贫乏的内置函数选择,而且该平台现在已经落后于SQL Server(甚至是开源SQLite) - Access 2016还没有自Access 2000(16年停滞!)以来SQL实现发生了重大变化,而SQL Server 2016的T-SQL语言如此发展,与SQL Server 2000相比几乎无法识别。
JET和ACE支持标准的ODBC函数(https://msdn.microsoft.com/en-us/library/bb208907(v=office.12).aspx),但这些函数都没有执行"反向索引"操作。同样缺少的是任何形式的模式匹配函数 - 虽然LIKE
运算符有效,但它只返回一个布尔结果,而不是一个字符索引。
简而言之:你想做的事是不可能的。
许多人在你之前发现了这一点:
他维护着一个DAO / Jet / etc保留字列表 - 在该列表中你会看到InstrRev是一个VBA()函数,而不是Jet / Ace引擎的一部分。
正如您所发现的,从Access中执行的SQL查询可以使用许多本地不受SQL / Jet方言支持的VBA函数
也就是说,计算/计算列仅用于存储的VIEW
对象("查询" Access用语中的对象) - 这反过来又用于方便用户,而不是用于任何编程优势 - 特别是因为这些是标量函数,它们针对引擎处理的每一行数据进行评估(使得它们可能非常昂贵并且运行效率低)。
...所以唯一真正的解决方案是放弃计算/计算列并在您自己的应用程序代码中执行此处理 - 但优点是您的程序可能会明显更快。
...或者不使用Access并切换到具有更好主动支持的其他DBMS,例如SQLite(用于进程内数据库),SQL Server(现在使用LocalDb
用于 - 进程支持),或VistaDB(专有,但100%托管代码)。请注意,Access还支持充当SQL Server"后端"的前端。数据存储 - 您可以在其中创建执行此操作的VIEW
,然后从您的访问代码或其他使用客户端查询视图。
如果必须,有一种解决方法:创建一个包含原始列的字符串反转值的重复列,然后可以在其上评估ODBC LOCATE
或JET SQL InStr
函数,得到你想要的结果(albiet,反转) - 但这需要两倍的存储空间。
e.g。
RowId, FileName , FileNameRev
1 , 'Foo.txt', 'txt.ooF'
2 , 'Bar.txt', 'txt.raB'
答案 1 :(得分:0)
避免任何计算字段。它只是一个“超级用户”功能,只会给你带来麻烦。计算字段 - 或表达式 - 属于查询。
因此,创建一个简单的选择查询:
Select
*,
InStrRev([FieldToCheck], "YourMatchingString") As StringMatch
From
YourTable
保存查询,然后在需要表值和此表达式时使用它。