Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 29/09/2008, 13h36   #1
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 034
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 034
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Par défaut Expressions régulières dans un SELECT

J'ai une colonne alphanumérique qui comporte un nombre variable d'étoiles (*) ou de zéros (0) et je souhaiterais rendre NULL ces valeurs.
Par contre, la requête ne doit pas me retourner les 'vrais' zéros à l'intérieur des nombres (ne doit pas retourner 12004 par exemple).

J'ai regardé du côté des expressions régulières de MySQL mais je ne trouve pas la bonne syntaxe.

Par exemple, je voudrais une requête qui me retourne toutes les valeurs de ce type :
0
00
000
00.0
000000000
000000.

Mais pas celles de ce type :
200025673 <-- vrai identifiant à conserver
000000001 <-- mauvais identifiant à éliminer plus tard
A000568932 <-- ça je ne sais pas encore quoi en faire !

La requête aurait la forme :
Code :
1
2
3
SELECT DISTINCT NUM_NAT_PERE
FROM bovins
WHERE NUM_NAT_PERE REGEXP uneExpressionRégulièreATrouver
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2008, 16h48   #2
Scorpi0
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
En formalisant ta demande, je pense que la solution parait plus simple :

Trouver les mots contenant seulement des 0 ou des * => trouver les mots qui contiennent au mois une fois un char dans [1-9] et [a-Z].

Peut être comme ça : [^1-9a-zA-Z]

Remarque, marche aussi avec NOT REGEXP, ce qui au final doit donner ça :

Code :
1
2
3
SELECT DISTINCT NUM_NAT_PERE
FROM bovins
WHERE NUM_NAT_PERE NOT REGEXP  '[1-9a-zA-Z]'
  Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 20h14   #3
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
Tiré du lien :

Citation:
a*

Correspond à toute séquence de zéro ou plus caractères a.

mysql> SELECT "Ban" REGEXP "^Ba*n"; -> 1
mysql> SELECT "Baaan" REGEXP "^Ba*n"; -> 1
mysql> SELECT "Bn" REGEXP "^Ba*n"; -> 1
Donc en faisant :
Code :
1
2
3
4
 
SELECT DISTINCT NUM_NAT_PERE
FROM bovins
WHERE NUM_NAT_PERE REGEXP  '^0*$'
(et '+' à la place de '*' si tu veux au moins un 0)


Scorpio, apparemment faut pas d'accolades

[edit] Testé et approuvé :

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
mysql> SELECT "000" REGEXP '^0*$';
+---------------------+
| "000" REGEXP '^0*$' |
+---------------------+
|                   1 |
+---------------------+
1 row IN SET (0.00 sec)
 
mysql> SELECT "001" REGEXP '^0*$';
+---------------------+
| "001" REGEXP '^0*$' |
+---------------------+
|                   0 |
+---------------------+
1 row IN SET (0.00 sec)
 
mysql> SELECT "001" REGEXP '^0+$';
+---------------------+
| "001" REGEXP '^0+$' |
+---------------------+
|                   0 |
+---------------------+
1 row IN SET (0.00 sec)
 
mysql> SELECT "000" REGEXP '^0+$';
+---------------------+
| "000" REGEXP '^0+$' |
+---------------------+
|                   1 |
+---------------------+
1 row IN SET (0.00 sec)
 
mysql> SELECT "1000" REGEXP '^0+$';
+----------------------+
| "1000" REGEXP '^0+$' |
+----------------------+
|                    0 |
+----------------------+
1 row IN SET (0.00 sec)
 
mysql> SELECT "0100" REGEXP '^0+$';
+----------------------+
| "0100" REGEXP '^0+$' |
+----------------------+
|                    0 |
+----------------------+
1 row IN SET (0.00 sec)
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2008, 00h06   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 034
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 034
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Merci pour vos réponses, j'aurais au moins appris quelque chose.
Mais pour le moment, j'ai procédé plus ou moins à la main avec une série de requêtes.

J'en aurai peut-être besoin quand même pour affiner encore le nettoyage des données.

En attendant je marque le sujet comme résolu. J'y reviendrai si j'ai encore besoin d'aide.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2008, 10h47   #5
Scorpi0
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
buchs, ta solution ne permet pas de détecter les 0.00


Motif#1: preg_match_all #0*#

000 -> 1
0.00 -> 0
1000 -> 0
010 -> 0
0aa46 -> 0
0***0 -> 0
*0123 -> 0


Motif#2: preg_match_all #[^a-zA-Z1-9]#

000 -> 1
0.00 -> 1
1000 -> 0
010 -> 0
0aa46 -> 0
0***0 -> 1
*0123 -> 0

Edit : ma solution permet de gérer aussi le cas des étoiles

Dernière modification par Scorpi0 ; 01/10/2008 à 11h15.
  Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2008, 13h08   #6
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
ça me semble outrageusement compliqué d'utiliser les regex dans ce cas-là...
Si on oublie les cas du genre A000568932 et qu'on considère que tes nombres sont entiers, je dirais :

Code :
1
2
3
4
SELECT DISTINCT NUM_NAT_PERE
FROM bovins
WHERE CAST(NUM_NAT_PERE AS VARCHAR) 
  = CAST(CAST(REPLACE(NUM_NAT_PERE, '*', '0') AS UNSIGNED) AS VARCHAR)
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun 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 06h45.


 
 
 
 
Partenaires

Hébergement Web