Удалить слова с прописными и строчными буквами или только строчными буквами

Цель: у меня есть таблица Access со столбцом Item_Desc. Я хочу, чтобы этот столбец содержал только названия брендов одежды. Названия брендов всегда пишутся ЗАГЛАВНЫМИ БУКВАМИ, например, «RALPH LAUREN».

Проблема. Столбец Item_Desc заполнен как названиями брендов, так и типом предмета одежды (а также цветом и т. д.). Таким образом, столбец Item_Desc может содержать, например, «RALPH LAUREN» (хорошо) или, возможно, «RALPH LAUREN Coat black» (плохо).

Вопрос: Можно ли выполнить запрос, который удалит из Item_Desc слова, которые либо: 1) начинаются с заглавной буквы, за которой следуют строчные буквы (например, "Пальто"), либо 2) написаны только в нижнем регистре (например, «черный»).

Таким образом, «RALPH LAUREN Coat black» в столбце Item_Desc будет просто «RALPH LAUREN».

Имя моей таблицы "Бренд".

Наконец, я не могу контролировать сгенерированный отчет, поэтому, к сожалению, я не могу импортировать бренд, стиль и цвет в отдельные столбцы для начала (я так не думаю!).


person Chase    schedule 08.05.2015    source источник
comment
Вы хотели сделать это, используя только базовый SQL Access, то есть запрос, который не зависит от пользовательской функции VBA? Я скептически отношусь к тому, является ли это разумной задачей для обычного доступа к SQL.   -  person HansUp    schedule 08.05.2015
comment
Я был бы в порядке с использованием VBA!   -  person Chase    schedule 08.05.2015


Ответы (1)


Вы можете использовать функцию VBA, основанную на регулярном выражении, для достижения своей цели.

Вот одна из таких функций, протестированная в окне Immediate с вашими примерами ввода:

? OnlyUpperCaseWords("RALPH LAUREN")
RALPH LAUREN
? OnlyUpperCaseWords("RALPH LAUREN Coat black")
RALPH LAUREN

Вы можете использовать эту функцию в запросе UPDATE для изменения сохраненных значений Item_Desc:

UPDATE Brand AS b
SET b.Item_Desc = OnlyUpperCaseWords(b.Item_Desc)
WHERE b.Item_Desc Is Not Null;

Это функция...

Public Function OnlyUpperCaseWords(ByVal strSource As String) As String
    Static re As Object

    If re Is Nothing Then
        Set re = CreateObject("VBScript.RegExp")
        re.Global = True
        re.IgnoreCase = False
        re.Pattern = "\s*\b[A-Za-z]*[a-z]+[A-Za-z]*\b\s*"
    End If
    'OnlyUpperCaseWords = re.Replace(strSource, vbNullString)
    OnlyUpperCaseWords = Trim(re.Replace(strSource, " "))
End Function
person HansUp    schedule 08.05.2015
comment
HansUp, большое спасибо за ответ. Поэтому я сохранил функцию в VBA как OnlyUpperCaseWords, а запрос сохранил в Access. Я попытался выполнить запрос, и он вернул сообщение об ошибке: Неопределенная функция «OnlyUpperCaseWords» в выражении. Есть идеи, как это решить? Из вашего ближайшего окна я вижу, что вы написали это прекрасно. Я просто пытаюсь понять, что я делаю неправильно! - person Chase; 08.05.2015
comment
Функция сохраняется как модуль в самой базе данных Access, которая содержит таблицу Brand. - person Chase; 08.05.2015
comment
Какое имя вы дали модулю? Если вы назвали модуль OnlyUpperCaseWords... так же, как и функцию... измените его на другое... modOnlyUpperCaseWords будет работать. - person HansUp; 08.05.2015
comment
Вау... ты хорош... великолепен. Это сработало отлично, и я благодарю вас за помощь, HansUp! - person Chase; 08.05.2015
comment
Позже я понял, что OnlyUpperCaseWords("ONE two THREE") вернет ONETHREE, поэтому изменил его, чтобы вернуть ONE THREE из этого ввода. - person HansUp; 08.05.2015