Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/01/2012, 10h46   #1
Invité régulier
 
Inscription : juillet 2009
Messages : 36
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 36
Points : 7
Points : 7
Par défaut Simplification LIKE - NOT LIKE

Bonjour,
Afin de nettoyer mes données téléphoniques, j'utilise LIKE dans une proc SQL.
J'ai essayé de nombreuses combinaisons (like, not like, and, or, ...) et je n'ai pas trouvé mieux que le code suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
proc sql;
CREATE TABLE test AS
	SELECT * FROM final
	WHERE std_phone NOT IN
			(SELECT DISTINCT std_phone FROM final 
			WHERE std_phone LIKE '%00000%' 
			OR std_phone LIKE '%11111%'
			OR std_phone LIKE '%22222%'
			OR std_phone LIKE '%33333%'
			OR std_phone LIKE '%44444%'
			OR std_phone LIKE '%55555%'
			OR std_phone LIKE '%66666%'
			OR std_phone LIKE '%77777%'
			OR std_phone LIKE '%88888%'
			OR std_phone LIKE '%99999%')
	AND mobile_phone NOT IN
			(SELECT DISTINCT mobile_phone FROM final 
			WHERE mobile_phone LIKE '%00000%'
			OR mobile_phone LIKE '%11111%'
			OR mobile_phone LIKE '%22222%'
			OR mobile_phone LIKE '%33333%'
			OR mobile_phone LIKE '%44444%'
			OR mobile_phone LIKE '%55555%'
			OR mobile_phone LIKE '%66666%'
			OR mobile_phone LIKE '%77777%'
			OR mobile_phone LIKE '%88888%'
			OR mobile_phone LIKE '%99999%');
quit;

Ce code fonctionne, mais je me demandais s'il n'y avait pas la possibilité de faire quelque chose de plus simple et surtout plus optimal?

Merci d'avance pour votre aide.
discus23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 11h03   #2
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 012
Points : 1 717
Points : 1 717
Hello;

la validation des numéros de téléphones Français et pas de numéros courts peut se faire avec le code suivant: .

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
DATA phone_number;
input phone $10.;
cards;
0652258788
1108888802
0512585474
0000000000
9999999999
8888888888
065512288 
069899    
02        
0112211221
0465555555
;
run;
 
 
 
 
DATA verif_phone;
SET phone_number;
 
IF ^prxmatch("/^0[1-9]([-. ]?[0-9]{2}){4}$/", phone) then verif='KO';
else verif='OK';
run;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/01/2012, 11h10   #3
Invité régulier
 
Inscription : juillet 2009
Messages : 36
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 36
Points : 7
Points : 7
Bonjour SAM,

Merci pour cette réponse rapide qui marche fort bien.
Par contre, pourrais tu m'expliquer un peu son fonctionnement?

Notamment le ^prxmatch ?
Toutes les valeurs que tu as saisies dans phone_number sont-elles suffisantes? Ou dois-je saisir toutes les possibilités?

Merci.
discus23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 11h31   #4
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 012
Points : 1 717
Points : 1 717
Et non toutes les combinaisons possibles sont dans l’expression … et oui c magique !!!
^prxmatch valeurs ne match pas Il faut que les valeurs commencent par 01 à 09 ( code régionale + portable) --->0[1-9]puis suivi de 8 chiffre ( toutes combinaisons possible 00 à 99 ) ----> [0-9]{2}multipilé fois 4 ----->{4} ce qui donne 8 chiffre + l’indicatif 01 à 09 = 10 chiffre numéro valideet au finale les numéro peuvent être séparer par des (-) ou (.) ou par des blancs ou par aucun séparateur --->[-. ]?

Pour finir voilà un exemple complet :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
DATA phone_number;
input phone  $14.;
cards;
0652258788    
1108888802    
0512585474    
0000000000    
9999999999    
8888888888    
065512288     
069899        
02            
0112211221    
0465555555    
01-12-25-88-12
01.12.25.88.12
01 99 52 89 12
;
run;
 
 
 
DATA verif_phone;
SET phone_number;
 
IF prxmatch("/^0[1-9]([-. ]?[0-9]{2}){4}$/", strip(phone)) then verif='OK';
else verif='KO';
run;
comme tu vois j'ai remplacé le ^prxmatch par prxmach et renversé le OK et KO
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 11h41   #5
Invité régulier
 
Inscription : juillet 2009
Messages : 36
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 36
Points : 7
Points : 7
Ah oui, effectivement..... c'est magique !!!
Merci beaucoup pour toutes ces explications!
discus23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h01.


 
 
 
 
Partenaires

Hébergement Web