2

嗨,

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

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

所有文本都是可变的,并且 URL 中有不同数量的“-”。

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

Instr([column],"-")+1

我想我想要类似的东西:

Mid(
    [column],
    Instr([column],"-")+1,
    InStr(InStr(1,[column],"-")-1,[column],"-")
)

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

理想情况下,我希望:“获取第一个位置-,第二个位置-,然后返回这两个位置之间的所有文本”

我有点绕圈子,虽然我认为我很接近,但我不再取得进展。

4

3 回答 3

5

您没有提到您正在执行此操作的上下文...... 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
于 2013-02-26T17:47:46.483 回答
0

您的代码非常接近。这是你想做的吗?

   dim first as integer
  dim second as integer
   dim result as string
   first = instr(1,"yourtext","-")
    second = instr(first+1,"yourtext","-")

   if first > 0 and second > first then
           second = second - first
            result = mid("yourtext",first+1, second-1)
     end if

对于 "xx-bbb-cc" ,结果将是 "bbb"

对于“xx-bbb-cc-zz-cc”,结果将是“bbb”

对于xxxx-bbb,不会有结果

于 2013-02-26T17:26:12.990 回答
0

我有同样的问题,这是一个你可以使用的函数,它允许字符串作为 startbit 和 endbit 分隔符,即使没有找到第二个分隔符,也可以从 teststring 中找到中间位。

Public Function middlebit(startbit, endbit, teststring)
Dim first As Integer
Dim second As Integer
middlebit = ""
If teststring <> "" Then
    first = InStr(1, teststring, startbit)
    second = InStr(first + Len(startbit), teststring, endbit)
    If second = 0 Then second = Len(teststring)
    If first > 0 And second > first Then
        second = second - first
        middlebit = Mid(teststring, first + Len(startbit), second - Len(startbit))
    End If
End If

结束功能

于 2016-10-06T12:22:29.027 回答