MS-Access: заменить кронштейн

В одной из таблиц ms-access, с которыми я работаю, у нас есть текстовое поле с заданным размером. В конце этого поля есть дополнительный код, который меняется в зависимости от ситуации. Я ищу способ удалить один из этих кодов, но даже когда последняя часть усекается максимальным размером поля.

Давайте назовем поле «поле», а код, который я хочу удалить, «abc-longcode».

Если я использую функцию замены SQL со строкой abc-longcode, запрос будет работать только после завершения кода.

Если я также хочу, чтобы мой запрос на обновление (который ничего не делает, кроме удаления этого конкретного кода в конце моего поля) работал с неполными кодами, как это будет переведено в ms-SQL?

Ему пришлось бы удалить (или, если быть точным, заменить на "" ) все следующее (пример, конечно, не настоящие коды):

abc-longcode
abc-longcod
abc-longco
abc-longc
abc-long
abc-lon
abc-lo
abc-l

Очевидно, я мог бы сделать это с помощью нескольких запросов. Каждый из них заменяет один из ожидаемых усеченных кодов... но это звучит не оптимально.

Кроме того, когда поле достаточно велико, чтобы получить весь код, иногда в конце могут быть дополнительные детали, которые я также захочу сохранить, поэтому я не могу просто искать «abc-l» и удалять все следующее: \

Этот запрос (или запросы, если я не могу найти лучшего способа) будет храниться непосредственно в базе данных .mdb.

Поэтому, хотя я могу придумать несколько способов сделать это вне запроса ms-sql, это мне не помогает.

Любая помощь? Спасибо.


person tb.    schedule 02.03.2010    source источник


Ответы (3)


Вы можете написать собственный метод замены VBA, который заменит любой из заданных случаев {"abc-longcode", ... "abc-l"}. По сути, это тот же подход, что и ваша идея «несколько запросов», за исключением того, что это будет только один запрос. Мой VBA ржавый, но что-то вроде:

public function ReplaceCodes(str as string) as string
     dim returnString as string

     returnString = str
     returnString = replace(returnString,"abc-longcode","")
     // ... etc...

     ReplaceCodes = returnString
end function

Возможно, я ошибся в порядке параметров при замене :)

person Matthew Groves    schedule 02.03.2010
comment
Я бы предпочел чисто SQL-способ сделать это, но я не думаю, что это можно сделать. Мне нравится этот ответ, так как он также позволяет мне помещать другие коды в ту же функцию, которую я тоже буду искать. пример: def-longcode, def-longcod и т.д... Спасибо за помощь! - person tb.; 02.03.2010
comment
чисто SQL-альтернатива — это длинная последовательность функций замены в запросе, которую трудно читать, трудно поддерживать и она уродлива. Доступ уже достаточно некрасивый :) - person Matthew Groves; 04.03.2010

Я бы использовал свою собственную функцию, чтобы сделать это, используя split для получения первой части строки. Затем вы можете использовать это значение в запросе на обновление.

Public Function FirstPart(thetext As String) As String
    Dim ret As String
    Dim arrSplitText As Variant

    arrSplitText = Split(thetext, "-")
    ret = arrSplitText(0)

    FirstPart = ret
End Function
person Buggabill    schedule 02.03.2010

Вы можете использовать:

 Left(FieldX,InStr(FieldX,"abc-")-1) 

ИЗМЕНИТЬ комментарий

Если есть пробел или другой стандартный разделитель:

 IIf(InStr(InStr(FieldX, "abc-"), FieldX, " ") = 0, Left(FieldX, InStr(FieldX, "abc-") - 1), Replace(FieldX, Mid(FieldX, InStr(FieldX, "abc-"), InStr(InStr(FieldX, "abc-"), FieldX, " ") - InStr(FieldX, "abc-")), ""))
person Fionnuala    schedule 02.03.2010
comment
Мне нравится этот ответ из-за его чисто SQL-характера, но проблема с этим кодом заключается в том, что если мой длинный код заполнен в поле и в конце поля есть некоторые дополнительные сведения, эти дополнительные сведения не будут сохранены. Другими словами, он удаляет все, начиная с того, что я ищу, а не только то, что я ищу. - person tb.; 02.03.2010
comment
Я не думаю, что вы действительно хорошо определили вопрос, поскольку я понятия не имею, во что вы хотите превратить свои образцы данных. И, насколько я вижу, ваши образцы данных не включают данные после того, что вы хотите удалить, поэтому довольно сложно придумать решение. - person David-W-Fenton; 03.03.2010
comment
Типы для меня симпатичные кролики, они случаются время от времени. - person David-W-Fenton; 04.03.2010
comment
@David W Fenton Эти комментарии, кажется, предназначены для OP, следовательно, а? - person Fionnuala; 04.03.2010
comment
Э-э, комментарий, который я адресовал был сделан ОП, верно? Там написано tb, и это тот, кто опубликовал исходный вопрос. - person David-W-Fenton; 05.03.2010