Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1003 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  REGEXP recherche sur libéllé

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

REGEXP recherche sur libéllé

n°2209415
solk17
Posté le 06-11-2013 à 15:34:13  profilanswer
 

bonjour à tous,
 
Depuis peu j'essaye de créer un expression régulière en SQL mais je m'y prend assez mal et cela ne fonctionne pas.
 
J'aimerai rechercher sur une un champ de type varchar, toute les occurrences ayant ayant au moins un caractère interdit. Ici les caractère interdits sont les caractères différents de ceux autorisés:
 
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w",
"x","y","z"
,"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"
,"0","1","2","3","4","5","6","7","8","9","/","-","?",":","("," )",".",
",","’","+"
 
J'ai bien essayé de faire cela avec INTERSECT, mais mon tablespace est trop petit pour pouvoir exécuter cette requête.
 
J'ai donc penser aux expressions régulière, mais je ne capte pas grand chose à cela. Pour avoir des caractère uniquement alphanumérique ainsi que des espace j'ai fait:
 

Code :
  1. SELECT nom_lib FROM table WHERE regexp_like (nom_lib, '\W \S ');


 
Mais cela n'a pas l'air de fonctionner.
 
Pourrier vous me donner un coup de pousse SVP.

mood
Publicité
Posté le 06-11-2013 à 15:34:13  profilanswer
 

n°2209492
olivthill
Posté le 06-11-2013 à 20:26:39  profilanswer
 

Quelle base de données ?
Il y a de grosses différences d'un SQL à l'autre.
S'il est question de Tablespace, alors c'est peut-être de l'Oracle.
 
Dans quel contexte s'exécute ce SQL ? Dans du PL/SQL, ou dans des requêtes simples ?
C'est plus facile dans du PL/SQL, car on peut avoir des variables pour stocker des résultats intermédiaires.
 
Ensuite, ce genre de filtre se fait habituellement dans un autre langage que SQL. Pourquoi se filtre ne se fait pas au moment du stockage des données, ou après la sélection d'une chaine de caractères ?
 
Pourquoi rechercher ces caractères interdits ?
Est-ce juste pour les remplacer, pour les supprimer ou pour les compter ?
 
Si c'est pour les remplacer, alors il y a la fonction TRANSLATE() qui fait ça très bien.
Si c'est pour les supprimer, alors on peut utiliser la fonction TRANSLATE() associée à la fonction TRIM()
Si c'est pour les compter, alors on peut utiliser la fonction TRANSLATE() associée à la fonction LENGTH()
On peut jouer aussi avec INSTR() et DECODE().
Ou si c'est dans du PL/SQL, on peut carrément faire une boucle sur chaque caractère pour voir s'il est interdit ou non. C'est le plus simple et il ne faut pas croire que ce serait plus long qu'une autre façon de faire qui serait plus condensée.
 
Voili. Bon courage.


Message édité par olivthill le 06-11-2013 à 20:27:07
n°2209513
Soileh
Lurkeur professionnel
Posté le 06-11-2013 à 22:51:37  profilanswer
 

solk17 a écrit :

bonjour à tous,
 
Depuis peu j'essaye de créer un expression régulière en SQL mais je m'y prend assez mal et cela ne fonctionne pas.
 
J'aimerai rechercher sur une un champ de type varchar, toute les occurrences ayant ayant au moins un caractère interdit. Ici les caractère interdits sont les caractères différents de ceux autorisés:
 
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w",
"x","y","z"
,"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"
,"0","1","2","3","4","5","6","7","8","9","/","-","?",":","("," )",".",
",","’","+"
 
J'ai bien essayé de faire cela avec INTERSECT, mais mon tablespace est trop petit pour pouvoir exécuter cette requête.
 
J'ai donc penser aux expressions régulière, mais je ne capte pas grand chose à cela. Pour avoir des caractère uniquement alphanumérique ainsi que des espace j'ai fait:
 

Code :
  1. SELECT nom_lib FROM table WHERE regexp_like (nom_lib, '\W \S ');


 
Mais cela n'a pas l'air de fonctionner.
 
Pourrier vous me donner un coup de pousse SVP.


 :hello: !
 
À mon avis, avec le SELECT que tu fais, c'est normal que tu n'obtiens pas ce que tu souhaites  [:cupra]  
En effet, tu écris :

Code :
  1. SELECT nom_lib FROM table WHERE regexp_like (nom_lib, '\W \S ');


ce qui se traduit par : nom_lib doit être composé  d'un caractère alphanumérique, suivi d'un espace suivi d'un espace ou tabulation, suivi d'un espace.
(soit dit en passant, je ne sais pas si les notations \W et \S existent en SQL :/)
 
Pour moi, il faudrait plutôt une expression du genre :

Code :
  1. SELECT nom_lib FROM table WHERE regexp_like (nom_lib, '^[[:alnum:] ]+$');


ce qui revient à retrouver tous les nom_lib comportant 1 ou plus des caractères compris dans les crochets, à savoir un caractère alphanumérique ou un espace.
Le ^ et le $ t'assurent que nom_lib ne comporte que les caractères souhaités.
 
Pour en revenir à ta question initiale, la regexp qui pourrait convenir est du genre :

Code :
  1. SELECT nom_lib FROM table WHERE regexp_like (nom_lib, '[a-zA-Z0-9/-?:().,’+]');


où on ne garde que les nom_lib comportant un caractère parmi ceux présents dans les crochets.
 
:jap:


---------------
And in the end, the love you take is equal to the love you make
n°2209532
solk17
Posté le 07-11-2013 à 09:25:49  profilanswer
 

Bonjour,
 
Cela à l'air de fonctionner pour trouver les caractères autorisés.
 
Pour répondre à olivthill oui il s'agit d'oracle.  
 
Je me suis peux être mal exprimé dans mon premier post. Mais je voudrai en réalité une requête qui recherche tous les nom_lib qui ont au moins un caractère différent de ceux que j'ai décrit dans le premier Post.
 
J'ai bien tester:
 

Code :
  1. SELECT nom_lib FROM table WHERE not regexp_like (nom_lib, '[a-zA-Z0-9/-?:().,’+]');


 
Mais sans succès visiblement.
 
Je croyais que le ^ excluait les caractères définis dans l’expression régulière, non?
 
 
Merci de votre aide et de vos réponses!  :love:  

n°2209549
solk17
Posté le 07-11-2013 à 10:32:07  profilanswer
 

C'est bon j'ai trouver.
 
J'ai fais ceci.
 

Code :
  1. select nom_lib from table1 where nom_ID not in (SELECT nom_ID FROM table1 WHERE regexp_like (nom_lib, '^[-a-zA-Z0-9/?:().,’+ ]+$'));


 
il faut mettre le '-' en début de condition pour qu'il soit accepter.
 
Merci encore.

n°2209572
Soileh
Lurkeur professionnel
Posté le 07-11-2013 à 12:00:05  profilanswer
 

solk17 a écrit :

Bonjour,
 
Cela à l'air de fonctionner pour trouver les caractères autorisés.
 
Pour répondre à olivthill oui il s'agit d'oracle.  
 
Je me suis peux être mal exprimé dans mon premier post. Mais je voudrai en réalité une requête qui recherche tous les nom_lib qui ont au moins un caractère différent de ceux que j'ai décrit dans le premier Post.
 
J'ai bien tester:
 

Code :
  1. SELECT nom_lib FROM table WHERE not regexp_like (nom_lib, '[a-zA-Z0-9/-?:().,’+]');


 
Mais sans succès visiblement.
 
Je croyais que le ^ excluait les caractères définis dans l’expression régulière, non?
 
 
Merci de votre aide et de vos réponses!  :love:  


 
C'est vrai que j'avais compris le contraire en fait  :whistle:  
 
Sinon, pour l'histoire du ^, tout dépend où il se trouve :

  • en début de pattern, cela signifie que c'est en début de ligne ;
  • dans une expression entre crochets, cela veut dire "un caractère qui n'est pas compris dans la liste entre crochets".


 [:cupra]


---------------
And in the end, the love you take is equal to the love you make

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  REGEXP recherche sur libéllé

 

Sujets relatifs
[Coordination d'un réseau de neurones artificiels]Recherche d'exemplesOptimisation recherche doublons
Comparer deux listes en multicritèresservice web de recherche
[recrutement] Recherche programmeur Ruby on RailsRecherche intégrateur Web
Recherche un plugin JQuery pour menu animé[WP/CMS]Recherche de plugin: inscription evenements + stats des users
Plus de sujets relatifs à : REGEXP recherche sur libéllé


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR