web-dev-qa-db-fra.com

Filtrer la correspondance exacte avec phrase / mots à l'aide de Regex dans le flocon de neige

Je veux filtrer des colonnes correspondant à un mot ou à une phrase spécifique. Par exemple, si j'ai choisi le mot anti pour filtrer, parmi les lignes suivantes:

this is anti-pattern
antimosquitos products
the Word anti is cool

Je veux juste garder le dernier, car c'est le seul qui correspond à l'ensemble du modèle de correspondance dans son ensemble et non à un autre mot.

J'ai essayé d'utiliser RLIKE et je reçois toujours une valeur FALSE mais je ne comprends pas pourquoi. Je m'attendais à avoir une valeur TRUE au moins dans l'une de ces déclarations SQL:

SELECT RLIKE ('Spray antimosquitos', '\bantimosquitos\b', 'i') as p1;
SELECT RLIKE ('Spray antimosquitos', '\santimosquitos\s', 'i') as p1;
SELECT RLIKE ('Spray antimosquitos', '\santimosquitos', 'i') as p1;
SELECT RLIKE ('Spray antimosquitos', '\santimosquitos', 'i') as p1;

Cependant, ce n'est pas le cas. J'ai essayé avec d'autres formes comme:

SELECT RLIKE ('Spray antimosquitos', '\b antimosquitos \b', 'i') as p1
SELECT RLIKE ('Spray antimosquitos', '*antimosquitos*', 'i') as p1
SELECT RLIKE ('Spray antimosquitos', ' antimosquitos ', 'i') as p1

Et je ne parviens pas à avoir une valeur retournée vraie.

Qu'est-ce qui ne va pas avec mon RLIM?

2
Javier Lopez Tomas

Tu dois

  • Assurez-vous que les backslashes sont doublées lorsque les backslashes sont utilisées dans les littéraux de chaîne pour créer des séquences d'échappement à chaîne (comme \t pour l'onglet, \n pour une alimentation en ligne, etc.)
  • Assurez-vous que le motif correspond à la chaîne entière, il s'agit simplement de savoir comment RLIKE fonctionne. Il est généralement activé en ajoutant .* aux deux extrémités du motif.

Donc, dans votre cas, vous pouvez utiliser

'.*\\bantimosquitos\\b.*'
1
Wiktor Stribiżew

La fonction RLIME renvoie true uniquement si l'expression régulière correspond à la chaîne entière:

SELECT RLIKE('Spray anti mosquitos', 'anti') as p1;  -- Returns FALSE because it doesn't match the whole string

SELECT RLIKE('Spray anti mosquitos', '.* anti .*'); -- Returns TRUE 

Si vous souhaitez un véritable résultat sur une correspondance partielle, vous pouvez utiliser REGEXP_INSTR et voir si le résultat est> 0. Si oui, cela retournera vrai:

SELECT REGEXP_INSTR('Spray anti mosquitos', 'anti', 1, 1, 0, 'i') > 0  as p1; -- Returns TRUE
1
Greg Pavlik