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

时间:2013-02-26 17:17:34

标签: ms-access

Hia的,

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

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

所有文字都是可变的,网址中有不同数量的“ - ”。

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

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

我觉得我想要这样的东西:

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

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

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

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

3 个答案:

答案 0 :(得分: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;

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

如果这是一个您将在Access应用程序会话中运行的查询,您可以根据我之前展示的Split()示例创建一个用户定义的函数。然后你的查询就会很简单。

SELECT
    GetStuffYouWant([column]) AS stuff_i_want
FROM YourTable;

您可能听说过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

功能......

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

答案 1 :(得分: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,将没有结果

答案 2 :(得分:0)

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

curl --header "PRIVATE-TOKEN: ****" "http://gitlab/api/v3/projects/:project_id:/merge_requests/:mr_id:/commits"

结束功能