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

Ms access 两个字符之间的访问字符串,ms-access,Ms Access,嗨 我有一个字符串(URL),我想在其中获取access查询中两个字符之间的第一个字符串 所有文本都是可变的,URL中的“-”数也不尽相同 我可以得到第一次出现的位置: Instr([column],"-")+1 我想我想要的是: Mid( [column], Instr([column],"-")+1, InStr(InStr(1,[column],"-")-1,[column],"-") ) 然而,这给了我字符串的第一块,后面是我想要的文本 我希望: 获取第一个

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

所有文本都是可变的,URL中的“-”数也不尽相同

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

Instr([column],"-")+1
我想我想要的是:

Mid(
    [column],
    Instr([column],"-")+1,
    InStr(InStr(1,[column],"-")-1,[column],"-")
)
然而,这给了我字符串的第一块,后面是我想要的文本

我希望: 获取第一个位置-,第二个位置-,然后返回这两个位置之间的所有文本


我在兜圈子,虽然我认为我已经接近了,但我不再取得进展。

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

   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”


XBBB,将没有结果

你没有提到你正在做的这个上下文…一个VBA过程,一个访问中的查询,一个来自访问会话外部的查询。但是如果你可以使用<代码> SPLIT()/<代码>函数,这将是非常容易的。请从即时窗口考虑这个例子。
strUrl=”http://websiteurl.com/sometext-STUFFIWANT-foo-bar"
varPieces=Split(strUrl,“-”)
?瓦片(1)
玩偶
既然你在一个查询中说你想这样做,我想你在寻找这样的东西

选择
中段(
[专栏],
仪表([列],“-”)+1,
(InStr(InStr([列],“-”)+1,[列],“-”)-InStr([列],“-”)-1
)作为我想要的东西
从你的桌子上;
这可能就足够了。但是,只要
[column]
为Null,它就会抛出“无效使用Null”错误。而且它还会阻塞
[column]
包含少于2个破折号的值。如果您能解决这些限制,您可能会选择继续。但是如果您需要修改复杂的字段表达式…祝您好运

如果这是一个在Access应用程序会话中运行的查询,则可以基于我前面展示的
Split()
示例创建一个用户定义的函数。这样,您的查询就很容易编写了

选择
GetStuffYouWant([column])作为我想要的内容
从你的桌子上;
您可能听到过UDF在查询中可能会变慢的警告。但是,在这种情况下,替代方法是
Mid()
加上一堆
InStr()
函数,对于db引擎来说,这并不是一个简单的工作负载。我将这两种方法与包含1000多万行的表进行了比较。完全填充DAO记录集所需的时间介于37到45秒之间,两种方法都不是一致的赢家

如果您想自己尝试UDF方法,我在下面介绍了这个函数。下面是一个即时窗口会话,用各种输入值测试这个函数

?GetStuffYouWant(空)
无效的
?GetStuffYouWant(“”)
无效的
?GetStuffYouWant(“abc”)
无效的
?GetStuffYouWant(“abc-”)
无效的
?GetStuffYouWant(“abc def”)
无效的
?GetStuffYouWant(“abc def-”)
def
?获取您想要的内容(“http://websiteurl.com/sometext-STUFFIWANT-foo-bar")
玩偶
和功能

公共函数GetStuffYouWant(ByVal pInput作为变量_
可选pSplitChar作为字符串=“-”)作为变量
将结果作为变量
变光片作为变体
如果为空(pInput),则
varResult=Null
其他的
varPieces=Split(pInput,pSplitChar)
如果UBound(varPieces)>1,则
varResult=varPieces(1)
其他的
varResult=Null
如果结束
如果结束
GetStuffYouWant=varResult
端函数

我也有同样的问题,这里有一个函数可以使用,它允许字符串作为起始位和结束位分隔符,并从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
公共函数中间位(起始位、结束位、测试字符串)
首先将Dim设置为整数
以整数表示的秒数
middlebit=“”
如果测试字符串为“”,则
first=InStr(1,teststring,startbit)
第二个=指令(第一个+长度(起始位),测试字符串,结束位)
如果second=0,则second=Len(teststring)
如果第一次>0,第二次>第一次,则
第二=第二-第一
中间位=Mid(测试字符串,第一个+Len(起始位),第二个-Len(起始位))
如果结束
如果结束
端函数