IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

SELECT avec REPLACE et REGEXP


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 414
    Points : 187
    Points
    187
    Par défaut SELECT avec REPLACE et REGEXP
    Bonjour à tous,
    Je souhaite extraire, lors de la requête, uniquement les chiffres du champ ayant la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Local =1350@@@Matériel =@@@Travaux =15000@@@Mobilier =…
    J'ai écrit la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT REPLACE(Besoin1, Besoin1 REGEXP '[^0-9]', "") AS Total FROM table1 WHERE id = 2
    La requête ne me retourne que 1, je ne vois pas comment finaliser cette requête pour obtenir 1350 !
    Si qqu'un à une piste d'avance merci !

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    C'est bourrin mais ça fonctionne avec MySQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Besoin1 * (Besoin1 / Besoin1) AS nombre
    FROM table1
    Plus propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CAST(Besoin1 AS UNSIGNED) AS Nombre
    FROM table1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Citation Envoyé par bronon Voir le message
    pour obtenir 1350
    Dans ce cas-là tu délaisses le 15000 de ta chaine ? Pour quelle raison ? Comment différencier quels chiffres doit-on extraire plus que d'autres ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 414
    Points : 187
    Points
    187
    Par défaut
    Merci CinePhil pour ta réponse rapide malheureusement aucune des solutions ne fonctionne correctement. Elles me retournent nombre ==> 0, bizarre non ?
    Je veux récupérer tous les nombres balisés par = et @@@, soit par ex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Matériel bureautique =25000@@@Matériel de  Transport=25000@@@…
    J'avais essayé avec des regex du genre /[^0-9@]/ et REPLACE mais je m'en suis pas sorti !
    D'autres pistes ?
    Bonne fin de journée

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Effectivement, ça ne fonctionnera que si la chaîne commence pas un nombre, je crois.

    Dans ton cas, si toutes les chaînes sont de la forme [des_caractères_sans_@]=[nombre][@...], tu pourras récupérer le premier nombre en jouant avec les fonctions de chaînes de caractères.

    1) Cherche la position du = avec la fonction LOCATE.
    2) Cherche la position du @ avec la même fonction.
    3) Extrait les caractères situés entre ces deux positions avec SUBSTRING.

    Je crois comprendre que ta colonne contient uen sorte de sérialisation de données, ce qui est une très mauvaise conception de BDD !
    J'ose espérer que ta recherche est dans le but de corriger cette grosse faute de conception ?

    Si tu as besoin de désérialiser les données pour les enregistrer dans un modèle correct, tu peux passer par un langage de programmation.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 414
    Points : 187
    Points
    187
    Par défaut
    Merci pour ta réponse,
    Effectivement C une sorte de sérialization des données qui sont dans cette table.
    Étant données que C la seule table de la base qui a cette structure j'aimerai comprendre pourquoi c'est nul de sérializer des données ?
    Désolé mais je découvre le pb.
    Cdlt

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    j'aimerai comprendre pourquoi c'est nul de sérializer des données ?
    Parce que ça ne respecte pas les formes normales de la conception des bases de données relationnelles, à commencer par la première.

    En principe, UNE colonne d'UNE table ne doit contenir qu'UNE information.

    À la rigueur, la sérialisation serait acceptable si le bloc de données enregistré est systématiquement utilisé en bloc, sans mise à jour et sans aucune extraction partielle des infos contenues dans le block sérialisé.

    Matériel bureautique =25000@@@Matériel de Transport=25000@@@…
    On a visiblement ici des catégories associées à des nombres. Il faudrait donc une table des catégories et, selon ce que représente ce nombre, le mettre en colonne de la table des catégories ou faire une autre table permettant l'association.

    De quoi s'agit-il, concrêtement ?

    Le modèle de données peut-il être modifié ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 414
    Points : 187
    Points
    187
    Par défaut
    Merci pour ta réponse très bien documentée mais avec toi j'ai pris l'habitude d'avoir qq chose de toujours au top !
    Aujourd'hui les colonnes sont enregistrées d'un bloc sans motif interne et lu d'un bloc donc C +/- dans les clous, les données extraites étant manipulées et mise en forme avec JS donc sur le front user. Je pensais pouvoir extraire des données partielles comme tu l'as bien compris.
    A ce stade ça sera un lourd travail de (re)modeler la table, le projet est très avancé.

    Je pense que je vais rester avec la aversion actuelle car le temps presse !

    Encore merci
    Bon App

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Select avec REGEXP
    Par remrem59 dans le forum Requêtes
    Réponses: 8
    Dernier message: 10/03/2010, 22h45
  2. problème avec "replace"
    Par lilipuce83 dans le forum ASP
    Réponses: 3
    Dernier message: 26/05/2004, 16h42
  3. requete select avec AS remplacement de valeur
    Par pi3141563 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/04/2004, 22h15
  4. pb de select avec size avec choix multiple
    Par La_picolle dans le forum ASP
    Réponses: 10
    Dernier message: 28/08/2003, 15h21
  5. requete SELECT avec un nombre constant
    Par gurumeditation dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/07/2003, 20h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo