2013-02-26 4 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; 

Это может быть даже достаточно. Тем не менее, он будет вызывать ошибки «недопустимого использования Null» всякий раз, когда [column] является Null. И он также захлестнет [column] значениями, которые включают менее двух тире. Если вы можете справиться с этими ограничениями, вам может быть хорошо идти. Но если вам нужно изменить это сложное выражение поля ... удачи!

Если это запрос, который будет запущен из сеанса приложения Access, вы можете создать пользовательскую функцию, основанную на примере Split(), который я показал вам ранее. Тогда ваш запрос будет прост для записи.

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

Возможно, вы слышали предупреждения о том, что UDF могут быть медленными в запросах. Однако в этом случае альтернативой является Mid() плюс набор функций InStr(), и на самом деле это не более простая рабочая нагрузка для движка db. Я сравнивал оба подхода с таблицей, содержащей более 10 миллионов строк.Время, необходимое для полного заполнения набора записей DAO, варьировалось от 37 до 45 секунд, причем ни один из них не стал последовательным победителем.

Если вы хотите попробовать подход UDF самостоятельно, я включил функцию ниже. И вот сеанс Immediate window, проверяющий функцию с различными входными значениями.

? 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

+0

Спасибо за помощь! – sbozzie

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 

для "хх-В-куб", результат будет "В"

для «хх-В-CC-ZZ-куб.сма, результат будет "БББ"

для ххого -bbb, не будет результата

0

Я та же проблема, вот функция, которую вы можете использовать, что позволяет строк как startbit и endbit разделителей, и находит middlebit изнутри 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 

End Function

Смежные вопросы