Вы не указали контекст, где вы это делаете ... процедура 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
Редактирование, чтобы сказать, что это вопрос! спасибо – sbozzie
Спасибо за помощь! – sbozzie