2011-04-04 4 views
11

J'ai eu des problèmes avec le terme clé d'accès LIKE et son utilisation. Je veux utiliser l'expression rationnelle suivante (expression régulière) sous forme de requête comme une sorte de « règle de Verfication » où l'opérateur LIKE filtre mes résultats:Microsoft Office Accès `LIKE` VS` RegEx`

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

Comment cela peut-il être accompli?

+0

RegEx ne peut pas être utilisé efficacement dans SQL dans Access/Jet/ACE. Ce n'est pas intégré dans le moteur de base de données, donc il n'utilisera pas d'index. Cela ne fait pas non plus partie de VBA, bien que vous puissiez utiliser le RegEx de l'objet File System si vous le voulez vraiment. Mais pour les règles de validation (je ne sais rien d'autre que vous pourriez vouloir dire pour la "règle de varification"), vous ne pouvez pas utiliser RegEx du tout. Vous pouvez cependant utiliser l'événement BeforeUpdate du contrôle que vous utilisez pour modifier, puis utiliser la fonction RegEx de l'objet File System pour tester la valeur dans la propriété Text du contrôle et agir en conséquence. –

Répondre

10

Je ne pense pas qu'Access autorise les correspondances regex (sauf dans VBA, mais ce n'est pas ce que vous demandez). L'opérateur LIKE ne prend même pas en charge l'alternance.

Par conséquent, vous devez le diviser en deux expressions.

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

(# signifie «un seul chiffre» dans Access).

24

Je sais que vous ne demandez pas à propos de la VBA, mais peut-être vous donnera une chance

Si vous ouvrez un projet VBA, insérer un nouveau module, puis choisissez Outils -> Références et ajouter une référence à Expressions régulières Microsoft VBScript 5.5. Étant donné que pate le code ci-dessous pour le module nouvellement inséré.

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 

Maintenant, vous pouvez utiliser la fonction ci-dessus dans votre SQL requêtes. Donc, votre question serait maintenant résolue en invoquant

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

si retourne une chaîne vide si rien ne correspond.

J'espère que vous l'avez aimé.

+0

Merci de prendre le temps de poster ce! Ça a bien marché. – PhilNicholas

+0

Bonjour, j'ai un petit problème avec cette méthode, il retourne aussi vrai pour les champs NULL. Pas un gros problème, je peux contourner cela, mais j'étais curieux de savoir pourquoi cela arrivait. – Cornel

Questions connexes