访问两个字符之间的字符串

sbo*_*zie 2 ms-access

HIA,

我有一个字符串(URL),我想在访问查询中的两个字符之间获取第一个字符串.

http://websiteurl.com/sometext-STUFFIWANT-foo-bar

所有文本都是可变的,URL中有不同数量的" - ".

我可以得到第一次出现的位置:

Instr([column],"-")+1
Run Code Online (Sandbox Code Playgroud)

而且我想我想要这样的东西:

Mid(
    [column],
    Instr([column],"-")+1,
    InStr(InStr(1,[column],"-")-1,[column],"-")
)
Run Code Online (Sandbox Code Playgroud)

这给了我字符串的第一个块,然后是我想要的一些文本.

我非常想:"拿到第一的位置 - ,第二的位置 - ,然后返回的2点位置之间的所有文本"

我会绕圈子走一圈,虽然我觉得我很接近,但我不再进步了.

Han*_*sUp 5

您没有提到您正在执行此操作的上下文... VBA过程,Access中的查询,来自Access会话外部的查询.但如果您可以使用该Split()功能,这可能非常简单.从立即窗口考虑此示例.

strUrl = "http://websiteurl.com/sometext-STUFFIWANT-foo-bar"
varPieces = Split(strUrl, "-")
? varPieces(1)
STUFFIWANT
Run Code Online (Sandbox Code Playgroud)

既然你已经说过你想在查询中这样做,我想你正在寻找这样的东西......

SELECT
    Mid(
        [column],
        InStr([column], "-") +1,
        (InStr(InStr([column], "-") +1, [column], "-") - InStr([column], "-")) -1
        ) AS stuff_i_want
FROM YourTable;
Run Code Online (Sandbox Code Playgroud)

这甚至可能就足够了.但是,只要[column]Null ,它就会抛出"无效使用Null"错误.它还会阻塞[column]包含少于2个破折号的值.如果你可以处理这些限制,你可能会很高兴.但是如果你需要修改那个复杂的字段表达式...祝你好运!

如果这是您将在Access应用程序会话中运行的查询,则可以基于Split()我之前展示的示例创建用户定义的函数.然后您的查询将很容易编写.

SELECT
    GetStuffYouWant([column]) AS stuff_i_want
FROM YourTable;
Run Code Online (Sandbox Code Playgroud)

您可能听说过UDF查询速度慢的警告.但是,在这种情况下,替代方案是Mid()加上一堆InStr()函数,这对数据库引擎来说并不是一个简单的工作负载.我将这两种方法与一个包含超过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
Run Code Online (Sandbox Code Playgroud)

功能......

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
Run Code Online (Sandbox Code Playgroud)