您没有提到您正在执行此操作的上下文...... VBA 过程,Access 中的查询,Access 会话外部的查询。Split()
但是,如果您可以使用该功能,这将非常容易。从立即窗口考虑这个例子。
strUrl = "http://websiteurl.com/sometext-STUFFIWANT-foo-bar"
varPieces = Split(strUrl, "-")
? varPieces(1)
STUFFIWANT
既然您已经说过要在查询中执行此操作,我认为您正在寻找类似的东西...
SELECT
Mid(
[column],
InStr([column], "-") +1,
(InStr(InStr([column], "-") +1, [column], "-") - InStr([column], "-")) -1
) AS stuff_i_want
FROM YourTable;
这甚至可能就足够了。但是,每当为 Null 时,它都会抛出“无效使用 Null”错误[column]
。它还会阻塞[column]
包含少于 2 个破折号的值。如果你能处理这些限制,你可能会很高兴。但是如果你需要修改那个复杂的字段表达式......祝你好运!
如果这是您将在 Access 应用程序会话中运行的查询,您可以根据Split()
我之前向您展示的示例创建一个用户定义的函数。那么您的查询将很容易编写。
SELECT
GetStuffYouWant([column]) AS stuff_i_want
FROM YourTable;
您可能听说过 UDF 查询速度可能很慢的警告。然而,在这种情况下,替代方案是Mid()
加上一堆InStr()
函数,这对于 db 引擎来说并不是一个更容易的工作负载。我将这两种方法与一个包含超过 1000 万行的表进行了比较。完全填充 DAO 记录集所需的时间在 37 到 45 秒之间,这两种方法都不是始终如一的赢家。
如果您想自己尝试 UDF 方法,我在下面包含了该函数。这是一个即时窗口会话,使用各种输入值测试该功能。
? GetStuffYouWant(Null)
Null
? GetStuffYouWant("")
Null
? GetStuffYouWant("abc")
Null
? GetStuffYouWant("abc-")
Null
? GetStuffYouWant("abc-def")
Null
? GetStuffYouWant("abc-def-")
def
? GetStuffYouWant("http://websiteurl.com/sometext-STUFFIWANT-foo-bar")
STUFFIWANT
并且功能...
Public Function GetStuffYouWant(ByVal pInput As Variant, _
Optional pSplitChar As String = "-") As Variant
Dim varResult As Variant
Dim varPieces As Variant
If IsNull(pInput) Then
varResult = Null
Else
varPieces = Split(pInput, pSplitChar)
If UBound(varPieces) > 1 Then
varResult = varPieces(1)
Else
varResult = Null
End If
End If
GetStuffYouWant = varResult
End Function