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

Langage SQL Discussion :

Requete sql , manipulation champ sql


Sujet :

Langage SQL

  1. #1
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut Requete sql , manipulation champ sql
    Bonjour,


    J'aimerais savoir si l'on peut réaliser ce genre de manipulation :

    champ manipulé : "monChamp" de la forme chaine1_chiane2_chaine3

    Supprimer tous les éléments de la table maTable si monChamp(en supprimant chaine3 et le "_")==chaine1_chiane2.

    Je ne peux pas utiliser seulement LIKE parce que je peux avoir pour monChamp :
    chaine1_chiane2_1_chaine3
    chaine1_chiane2_2_chaine3
    chaine1_chiane2_3_chaine3
    chaine1_chiane2_4_chaine3


    Merci d'avance pour les infos

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Tu donnerais un exemple réel ?

  3. #3
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut
    Pas de probleme

    Disons qu'il y a c'est infos dans le champs "monChamps" de la table "maTable" :

    L_personne_1_agee
    L_personne_2_agee
    L_personne_3_agee
    L_pere_agee
    S_mere_1_agee
    S_mere_1_agee2
    S_mere_jeune
    S_adulte_jeune
    R_adulte_jeune

    Et je vais disposer d'un chaine de caratere me permettant de trouver ce que je souhaite qui pourra etre égal à: L_personne, S_mere ou encore S_mere_1. cette chaine se nommme maChaine.

    Exemple de la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT monChamps FROM maTable WHERE monChamps(sans la derniere chaine de caretere et le "_")==maChaine
    Sij'utilisais LIKE et que maChaine=S_mere j'aurais comme réponse à la requete :
    S_mere_1_agee
    S_mere_1_agee2
    S_mere_jeune
    Ce qui n'est pas le résultat escompté.


    J'espere que c'est plus clair comme ca

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Citation Envoyé par Katachana Voir le message
    Ce qui n'est pas le résultat escompté.
    OK... et quel est le résultat escompté ?

  5. #5
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut
    Le résultat escompté : si maChaine=S_mere , récupérer seulement :
    S_mere_agee
    S_mere_jeune


    si l'on a maChaine=S_mere_1 , récuperer seuelement :
    S_mere_1_agee

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Donc, le problème, c'est d'échapper le _ ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monChamps LIKE CONCAT(machaine, '\_%')

  7. #7
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut
    d'échapper _derniere chaine .

    Exemple pour cette chaine "S_mere_1_jeune", il faudrait échapper "_jeune".

    De meme pour "S_mere_jeune" il faudrait échapper "_jeune".

    Ce qu'il faut échapper sera toujours situé _ la chaine de la chaine de monChamps;

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    as-tu testé ma solution ?

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    Salut.

    Perso, j'aurais testé si le début de monChamp est égal à maChaîne, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select ... from ...
    where SUBSTR(monChamp,1,LENGTH(maChaine))=maChaine
    Après, ça dépend du SGBD utilisé et des fonctions disponibles...(le code montré fonctionne sous Oracle)

  10. #10
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut
    SELECT ... FROM ...
    WHERE SUBSTR(monChamp,1,LENGTH(maChaine))=maChaine

    Ce ne devrait pas marcher : si j'ai maChaine=L_mere , je vais avoir comme résultat de ma requete :
    L_mere_personne
    L_mere_1_jeune
    L_mere_2_jeune
    L_mere_agee

    Alors que je souhaite seulement comme résultat de ma requete :
    L_mere_personne
    L_mere_agee



    Meme chose pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monChamps LIKE CONCAT(machaine, '\_%')

    Il faudrait en fait pouvoir échapper "_chaine" de la fin de monChamps et faire une comparaison monChamps==maChaine, est-ce possible??

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    @marchand_de_sable : ça revient au même que de faire LIKE CONCAT(machaine, '%'), mais ce n'est pas assez sélectif

    @Katachana : je pense vraiment que le problème vient du caractère spécial _, mais la syntaxe que je t'ai donnée est celle de MySQL. Quel est ton SGBD ?

  12. #12
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut
    Mysql

  13. #13
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    Citation Envoyé par Antoun
    @marchand_de_sable : ça revient au même que de faire LIKE CONCAT(machaine, '%'), mais ce n'est pas assez sélectif
    Ha ben oui...
    Encore parlé trop vite...

  14. #14
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut
    quelle est la signification exact de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monChamps LIKE CONCAT(machaine, '\_%')

    machaine LIKE CONCAT(monChamps, '\_%') ne serait pas plus logique??? (j'ai essayé aussi mais sans résultat)

  15. #15
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    ça veut dire : mon champ commence par ma chaîne, suivie d'un _, suivi de n'importe quoi. Mais effectivement, je relis tes exemples et ça ne correspond pas à ce que tu veux.

    Comment exprimerais-tu ton filtre ?

    1. mon champ commence par ma chaîne, suivie d'un _, suivi d'un seul élément
    2. mon champ commence par ma chaîne, suivie d'un _, suivi de lettres (mais pas de chiffres)

    Dans tous les cas, je pense qu'il faudra faire une REGEXP.

  16. #16
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut
    Mon filtre :

    mon champ sans le dernier _chaine est égale à ma chaine.

    Ce filtre devrait aussi marcher je pense:
    mon champ commence par ma chaîne, suivie d'un _, suivi d'un chaine de caractère.


    Mettons que maChaine=L_mere.

    Si l'on a monChamps=L_mere_1_jeune

    le resultat de la requete est row=0 , non ???

  17. #17
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    Citation Envoyé par Antoun
    Comment exprimerais-tu ton filtre ?

    1. mon champ commence par ma chaîne, suivie d'un _, suivi d'un seul élément
    2. mon champ commence par ma chaîne, suivie d'un _, suivi de lettres (mais pas de chiffres)
    Bonne question.

    Allez j'ose...
    si on prend la condition 1, on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select ... from ...
    where SUBSTR(monChamp,1,LENGTH(maChaine))=maChaine
    and SUBSTR(monChamp,LENGTH(maChaine)+1) not like '_%_%'
    Citation Envoyé par Antoun
    Dans tous les cas, je pense qu'il faudra faire une REGEXP.
    +1
    Ca serait effectivement plus propre.

    [edit]Je ne maîtrise pas les fonctions MySQL, mais j'imagine qu'on peut isoler la partie _chaine3 de monChamp (ou plutôt l'enlever).
    Mais je ne peux te proposer que du code Oracle pendant la journée...

    @Antoun : On peut faire des REGEXP avec les fonctions "de base" SQL, sans faire appel à des procédures stockées ?[/edit]

  18. #18
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Citation Envoyé par marchand_de_sable Voir le message
    Allez j'ose...
    si on prend la condition 1, on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select ... from ...
    where SUBSTR(monChamp,1,LENGTH(maChaine))=maChaine
    and SUBSTR(monChamp,LENGTH(maChaine)+1) not like '_%_%'
    Superbe !
    J'apporterais trois petits correctifs : 1) le _ doit être échappé en \_, 2) comme % marche aussi avec zéro caractères, le premier _ est inutile et 3) le LIKE est plus efficace que le SUBSTR, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    where monChamp LIKE CONCAT(maChaine, '%')  -- même début
    and SUBSTR(monChamp, LENGTH(maChaine)+2) not like '%\_%' -- la suite ne contient pas d'underscore
    Citation Envoyé par marchand_de_sable Voir le message
    Ca serait effectivement plus propre.
    Pas évident. Les regex sont plus gourmandes que le LIKE.
    Citation Envoyé par marchand_de_sable Voir le message
    Mais je ne peux te proposer que du code Oracle pendant la journée...
    LENGTH et SUBSTR fonctionnent de la même manière avec MySQL.
    (... avec un jeu de caractères mono-octet comme latin1 ; par compatibilité avec Unicode, il faudrait utiliser CHAR_LENGTH au lieu de LENGTH).
    Citation Envoyé par marchand_de_sable Voir le message
    @Antoun : On peut faire des REGEXP avec les fonctions "de base" SQL, sans faire appel à des procédures stockées ?
    Avec MySQL c'est l'opérateur REGEXP.
    Avec Oracle, j'ai vu dans la doc qu'il existait les fonctions REGEXP_INSTR, REGEXP_REPLACE et REGEXP_SUBSTR, mais je n'ai jamais testé.

  19. #19
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut
    Un tres grand merci à vous deux !!!!!!! Ca marche parfaitement et va améliorer sensiblement la propreté de mon code .

  20. #20
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    On peut aussi faire sous Oracle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select ... from ...
    where SUBSTR(monChamp,1,INSTR(monChamp,'_',-1)-1)=maChaine
    où la valeur -1 du dernier paramètre de INSTR permet de repérer la position du 1er '_' en partant de la fin (et donc de couper monChamp à cet endroit-là).
    Mais je ne sais pas si INSTR ou LOCATE sous MySQL peuvent balayer une chaîne de la fin vers le début.

    Pour ce qui est du caractère d'échappement '\_', je ne sais pas si ça fonctionne de la même manière sous Oracle. Il ne semble pas indispensable dans ce cas-là en tout cas.

    Quoi qu'il en soit, c'est une solution à un cas très particulier qui ne fonctionnera plus dès lors que monChamp sera formaté autrement. C'est là que je trouve les REGEXP plus "propres" dans le sens ou elles permettent plus de manip, et qu'il serait probablement possible de simplement modifier la REGEXP et non toute la condition.
    Mais bon, tant que ça marche comme ça

    Citation Envoyé par Antoun
    Pas évident. Les regex sont plus gourmandes que le LIKE.

    (... avec un jeu de caractères mono-octet comme latin1 ; par compatibilité avec Unicode, il faudrait utiliser CHAR_LENGTH au lieu de LENGTH).

    Avec MySQL c'est l'opérateur REGEXP.
    Avec Oracle, j'ai vu dans la doc qu'il existait les fonctions REGEXP_INSTR, REGEXP_REPLACE et REGEXP_SUBSTR, mais je n'ai jamais testé.
    C'est noté

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requete SQL sur champ datetime si heure
    Par blacklolou dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 26/06/2012, 17h04
  2. Requete sur partie champ SQL
    Par pixworld dans le forum Requêtes
    Réponses: 6
    Dernier message: 14/06/2011, 17h14
  3. [REQUETE]Afficher un champ "case à cocher" dans une requête SQL-Access
    Par Amael ROCHE dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/04/2007, 11h07
  4. Pb sur une requête SQL (de champ vide)
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 11h12
  5. [sql] [jointure] champs = substring(champs,1,5)
    Par DaxTaz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/05/2004, 12h45

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