Hia的,
我有一个字符串(一个URL),我想在访问查询中的两个字符之间获取第一个字符串。
http://websiteurl.com/sometext-STUFFIWANT-foo-bar
所有文字都是可变的,网址中有不同数量的“ - ”。
我可以得到第一次出现的位置:
Instr([column],"-")+1
我觉得我想要这样的东西:
Mid(
[column],
Instr([column],"-")+1,
InStr(InStr(1,[column],"-")-1,[column],"-")
)
这给了我字符串的第一个块,然后是我想要的一些文本。
我理想情况下: “获得第一个位置 - 第二个位置 - 然后返回这两个位置之间的所有文本”
我会绕圈子走一圈,虽然我觉得我很接近,但我不再进步了。
答案 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"
结束功能