2013-02-26 37 views
2

Hia,兩個字符之間的訪問字符串

我有一個字符串(一個URL),我想要在訪問查詢中的兩個字符之間獲得第一個字符串。

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

中的所有文本是可變的,也有不同數量的「 - 」中的URL。

我可以第一次出現的位置:

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

,我想我想是這樣的:

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

這是給我然而字符串的第一塊,其次是一些我想要的文字。

我非常想: 「拿到第一的位置 - ,第二的位置 - ,然後返回所有的2點位置之間的文本」

我轉圈圈了一下,儘管我認爲我很接近,但我不再進步。

回答

5

你沒有提到你在做這個事情的上下文......一個VBA過程,一個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]爲空,它就會拋出「無效使用空值」錯誤。並且它還會扼殺[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 
+0

編輯說這是一個查詢!謝謝 – sbozzie 2013-02-26 21:15:33

+0

謝謝你的幫助! – sbozzie 2013-02-27 10:05:47

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,不會有結果

0

我有同樣的問題,這裏是一個功能,您可以使用,它允許字符串作爲起始位和endbit分隔符,並從內部找到middlebit測試字符串,即使沒有找到第二個分隔符。

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 

端功能

相關問題