Microsoft Access 2016中的InstrRev函数是否替换了计算列?

时间:2017-05-18 00:27:28

标签: ms-access

我试图在一个表中创建几个计算列,其中包含已解析文件名的不同部分。使用InstrRev函数对于隔离基本文件名或扩展名至关重要,但计算列中不支持InstrRev。

我知道还有其他方法可以解决我的问题,不使用计算列,但有没有人有一个有效的计算列公式,可以帮助我?

2 个答案:

答案 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运算符有效,但它只返回一个布尔结果,而不是一个字符索引。

简而言之:你想做的事是不可能的。

许多人在你之前发现了这一点:

也就是说,计算/计算列仅用于存储的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

保存查询,然后在需要表值和此表达式时使用它。