Microsoft Office Access `LIKE` VS `RegEx`

У меня возникли проблемы с термином ключа доступа LIKE и его использованием. Я хочу использовать следующее RegEx (регулярное выражение) в форме запроса как своего рода «правило проверки», где оператор LIKE фильтрует мои результаты:

"^[0]{1}[0-9]{8,9}$"

Как это можно сделать?


person Tamir    schedule 04.04.2011    source источник
comment
RegEx не будет эффективно использоваться в SQL в Access/Jet/ACE. Он не встроен в ядро ​​базы данных, поэтому не будет использовать индексы. Это также не часть VBA, хотя вы можете использовать RegEx из объекта файловой системы, если хотите. Но для правил проверки (я не знаю, что еще вы могли бы иметь в виду для правила вариации) вы вообще не можете использовать RegEx. Однако вы можете использовать событие BeforeUpdate элемента управления, который вы используете для редактирования, а затем использовать функцию RegEx из объекта файловой системы, чтобы проверить значение в свойстве Text элемента управления и действовать соответствующим образом.   -  person David-W-Fenton    schedule 07.04.2011


Ответы (2)


Я не думаю, что Access допускает совпадения регулярных выражений (кроме VBA, но это не то, о чем вы спрашиваете). Оператор LIKE даже не поддерживает чередование.

Поэтому вам нужно разделить его на два выражения.

... WHERE (Blah LIKE "0#########") OR (Blah LIKE "0########")

(# означает «одна цифра» в Access).

person Tim Pietzcker    schedule 04.04.2011

Я знаю, что вы не спрашивали о VBA, но, возможно, вы дадите ему шанс.

Если вы открываете проект VBA, вставляете новый модуль, затем выбираете Инструменты -> Ссылки и добавляете ссылку на Регулярные выражения Microsoft VBScript 5.5. Учитывая, что вставьте приведенный ниже код во вновь вставленный модуль.

Function my_regexp(ByRef sIn As String, ByVal mypattern As String) As String
   Dim r As New RegExp
    Dim colMatches As MatchCollection
    With r
        .Pattern = mypattern
        .IgnoreCase = True
        .Global = False
        .MultiLine = False
        Set colMatches = .Execute(sIn)
    End With
    If colMatches.Count > 0 Then
        my_regexp = colMatches(0).Value
    Else
        my_regexp = ""
    End If
End Function

Теперь вы можете использовать приведенную выше функцию в своих запросах SQL. Итак, ваш вопрос теперь будет решен путем вызова

SELECT my_regexp(some_variable, "^[0]{1}[0-9]{8,9}$") FROM some_table

if вернет пустую строку, если ничего не совпадает.

Надеюсь, вам понравилось.

person MPękalski    schedule 04.04.2011
comment
Привет, у меня есть одна небольшая проблема с этим методом, он также возвращает true для полей NULL. Не большая проблема, я могу обойти это, но мне было любопытно, почему это происходит. - person Cornel; 24.06.2016