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

DB2 Discussion :

Problème d'apostrophe sur une sélection


Sujet :

DB2

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 105
    Points
    105
    Par défaut Problème d'apostrophe sur une sélection
    Bonjour,
    Je cherche à retourner tous les clients qui se trouvent dans une ville donnée, j'ai donc grosso-modo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select * from clients
    where clVille LIKE 'maVilleCherchée%'
    Pas de probleme si ce n'est quand je demande pour une ville avec apostrophe (ex: faye d'anjou, l'hay les roses...), là ben, il trouve rien...
    Je cherche donc un moyen de contourner ce probleme en ignorant l'apostophe mais sans resultat(translate de ' en rien). Donc si quelqu'un avait une idée car je supppose que c'est un problème récurrent.

    D'avance merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 123
    Points : 146
    Points
    146
    Par défaut
    Bonjour,

    Tu peux essayer avec la valeur en hexa de ton caractère apostrophe de la manière suivante :

    SELECT * FROM clients WHERE clVille LIKE '%'!!X'valeur en hexa de l apostrophe'!!'%'

    Alex.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par alex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM  clients
    WHERE clVille LIKE '%'!!X'valeur en hexa de l apostrophe'!!'%'
    Merci de ta réponse mais elle plus qu'obscure pour moi! (je débute).
    Bon la valeur hexa de la simple quote est 27, jusque là, ça va.
    Mais ensuite, pourquoi les % se retrouvent entre quotes?
    Qu'est ce que les !! ?
    X signifie t'il qu'on précise une valeur hexa?
    Et la valeur "maVilleRecherchée" à laquelle je veux comparer mon champs où est ce que je la précise?
    (En clair j'ai rien compris )

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 123
    Points : 146
    Points
    146
    Par défaut
    Bonjour,

    !! = concaténation de 2 chaines de caractères : 'A' !! 'B' = 'AB'
    le % est le cacractère de recherche générique
    LIKE '%'!!X'valeur en hexa de l apostrophe'!!'%' équivaut les chaînes de caractères contenant l'apostrophe par exemple ABC'DE ou 'ABC ou ABC'
    X veut bien dire que c'est en hexa.

    En admettant que tu recherches les villes avec "L' ....", ta requête ressemblera à ça :

    SELECT * FROM clients
    WHERE clVille LIKE 'L'!!x'27'!!'%'

    Si tu cherches l'hay les roses :
    SELECT * FROM clients
    WHERE clVille LIKE 'L'!!x'27'!!'hay les roses%'

    Par contre, je te conseille de vérifier le cadrage de tes noms de villes,
    "l'hay les roses" étant différent de "l ' hay les roses ". Il faudra faire ( à tester ), clVille LIKE 'L%'!!x'27'!!'%hay les roses%' en espérant que tu n'es pas une ville qui s'appelle l'ahay les roses. Il est aussi possible qu'un programme fasse déjà le bon formatage avant d'introduire les données dans DB2. Si tu ne le connais pas, renseignes-toi cela te permettra de connaître les cas et pièges à prendre en compte.

    Alex.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 123
    Points : 146
    Points
    146
    Par défaut
    Bonjour,

    !! = concaténation de 2 chaines de caractères : 'A' !! 'B' = 'AB'
    le % est le cacractère de recherche générique
    LIKE '%'!!X'valeur en hexa de l apostrophe'!!'%' équivaut les chaînes de caractères contenant l'apostrophe par exemple ABC'DE ou 'ABC ou ABC'
    X veut bien dire que c'est en hexa.

    En admettant que tu recherches les villes avec "L' ....", ta requête ressemblera à ça :

    SELECT * FROM clients
    WHERE clVille LIKE 'L'!!x'27'!!'%'

    Si tu cherches l'hay les roses :
    SELECT * FROM clients
    WHERE clVille LIKE 'L'!!x'27'!!'hay les roses%'

    Par contre, je te conseille de vérifier le cadrage de tes noms de villes,
    "l'hay les roses" étant différent de "l ' hay les roses ". Il faudra faire ( à tester ), clVille LIKE 'L%'!!x'27'!!'%hay les roses%' en espérant que tu n'es pas une ville qui s'appelle l'ahay les roses. Il est aussi possible qu'un programme fasse déjà le bon formatage avant d'introduire les données dans DB2. Si tu ne le connais pas, renseignes-toi cela te permettra de connaître les cas et pièges à prendre en compte.

    Alex.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par alex.
    LIKE '%'!!X'valeur en hexa de l apostrophe'!!'%' équivaut les chaînes de caractères contenant l'apostrophe par exemple ABC'DE ou 'ABC ou ABC'
    X veut bien dire que c'est en hexa.
    Donc je recherche les villes ayant une apostrophe.

    Citation Envoyé par alex.
    En admettant que tu recherches les villes avec "L' ....", ta requête ressemblera à ça :

    SELECT * FROM clients
    WHERE clVille LIKE 'L'!!x'27'!!'%'

    Si tu cherches l'hay les roses :
    SELECT * FROM clients
    WHERE clVille LIKE 'L'!!x'27'!!'hay les roses%'
    Donc il faut que je construise à la mano ma requête pour remplacer dans ma ville recherchée l'apostrophe par x'27'?
    (J'ai pas testé, c'est juste de la théorie car j'ai copié un bout de code existant qui fonctionne bien, même si je sais pas pourquoi, puisqu'il sert juste à ajouter % enfin de variable)

    Citation Envoyé par alex.
    Par contre, je te conseille de vérifier le cadrage de tes noms de villes,
    "l'hay les roses" étant différent de "l ' hay les roses ".
    Tout à fait, c'est pas pris en compte mais ce n'est pas gênant. Je vais quand même appronfondir la question.

    Merci de ton aide.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Points : 63
    Points
    63
    Par défaut
    Que tout cela est bien compliqué

    select * from testal1 where al1_char like 'L ''%';
    ------------------------------------------------------------------------------
    Results for a single query are displayed on the Query Results tab.
    1 row(s) returned successfully.

    Il suffit de doubler la quote qui se trouve dans le nom à retrouver

    select * from testal1 where al1_char like '__''%';
    ------------------------------------------------------------------------------
    Results for a single query are displayed on the Query Results tab.
    1 row(s) returned successfully.


    Dans cet exemple; la quote est en troisième position, le deux premières peuvent être n'importe quoi, de même à partir de la quatrième position.

    select * from testal1 where al1_char like '%''%';
    ------------------------------------------------------------------------------
    Results for a single query are displayed on the Query Results tab.
    1 row(s) returned successfully.

    Ici la quote peux être n'importe où.

    Doubler la quote est aussi valable pour INSERT et UPDATE.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par ALHER
    Que tout cela est bien compliqué
    Je suis d'accord, surtout que vos solutions ne sont pas génériques (enfin je pense). Je ne veux pas retrouver les villes contenant une apostrophe mais une ville dont l'utilisateur a saisi le début (LIKE 'mavilleCherchée%'). Mon problème est : si ma ville contient une apostrophe, rien n'est retournée.
    Bon, le problème n'est plus urgent puisqu'une solution a été trouvée. Mais si une solution pouvait répondre à la queston via du sql, ce serait peut être intéressant.
    Merci beaucoup de votre aide.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Trim + Concat ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIKE TRIM(VilleRecherchée) CONCAT '%'
    ne conviendrait-il pas ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Qu'est ce que ce Trim + Concat svp ?
    Que va être le résultat de la requête ??

  11. #11
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Tu peux utiliser la fonction Replac pour remplacer ' par '' dans la ville que tu cherche. Mais comment génères-tu ta commande SQL ?

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Trim() & Concat()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Qu'est ce que ce Trim + Concat svp ?
    Que va être le résultat de la requête ??
    La fonction Trim() supprime les blancs en début et fin de chaîne.
    La fonction Concat() est l'équivalent des !! (deux points d'exclamation accolés).

    Donc, sur le prédicat WHERE suivant,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE clVille LIKE Trim(VilleRecherchée) !! '%'
    Si l'utilisateur a saisi "^^Paris^^^^^" (le caractère ^ représentant ici un espace) et si ces 2 fonctions (ou équivalents) sont supportées par ton SGBD, cela équivaudra à avoir saisi "Paris%" dans la variable VilleRecherchée , au lieu de "^^Paris^^^^^%".
    Cela devrait marcher même avec des apostrophes dans le nom de la ville...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par jab
    Mais comment génères-tu ta commande SQL ?
    Je fais du sql dynamique en rpgle. J'ai résolu mon problème en définissant ma variable de saisie en varying (pour résoudre à l'origine les problèmes d'espace et ne pas avoir à utiliser de trim). J'ai, du coup, résolu mes deux problèmes. Après pourquoi ça marche, là est la question!

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Varying
    Effectivement, déclarer en RPG IV la variable VilleRecherchée en "varying" résoud le problème des blancs. Il suffit alors de concaténer le symbole "%" dans la variable pour faire la recherche avec un LIKE sql.

    Pouquoi ça marche
    Et bien parce que justement tu as fort judicieusement déclaré la zone de saisie en longueur variable.
    La zone mémoire allouée pour les zones caractère de longueur variable est de deux octets plus longue que la longueur déclarée. Cette zone se compose d'un compteur binaire (transparent pour toi) qui contient la longueur de la saisie et la valeur saisie elle-même.
    Ainsi si on place la valeur "Paris" dans la variable, celle-ci sera constituée d'un compteur de 2 octets binaires valant x'0005' (longueur de la saisie) suivis de la valeur saisie "Paris". C'est le compilateur qui fait le calcul, tu n'as pas a en tenir compte.
    En y suffixant le caractère "%", la zone contient alors x'0006' (le compteur) suivi de "Paris%". La longueur est automatiquement recalculée et SQL s'en accommode.

    N'as-tu pas également des soucis entre majuscules et minuscules dans le nom de la ville ?

    Remarque : que la zone de saisie soit déclarée de longueur variable ou pas, l'exemple que j'ai montré dans mon post précédent aurait aussi bien marché.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par Mercure
    Effectivement, déclarer en RPG IV la variable VilleRecherchée en "varying" résoud le problème des blancs. Il suffit alors de concaténer le symbole "%" dans la variable pour faire la recherche avec un LIKE sql.

    Pouquoi ça marche
    Et bien parce que justement tu as fort judicieusement déclaré la zone de saisie en longueur variable.
    La zone mémoire allouée pour les zones caractère de longueur variable est de deux octets plus longue que la longueur déclarée. Cette zone se compose d'un compteur binaire (transparent pour toi) qui contient la longueur de la saisie et la valeur saisie elle-même.
    Ainsi si on place la valeur "Paris" dans la variable, celle-ci sera constituée d'un compteur de 2 octets binaires valant x'0005' (longueur de la saisie) suivis de la valeur saisie "Paris". C'est le compilateur qui fait le calcul, tu n'as pas a en tenir compte.
    En y suffixant le caractère "%", la zone contient alors x'0006' (le compteur) suivi de "Paris%". La longueur est automatiquement recalculée et SQL s'en accommode.

    N'as-tu pas également des soucis entre majuscules et minuscules dans le nom de la ville ?

    Remarque : que la zone de saisie soit déclarée de longueur variable ou pas, l'exemple que j'ai montré dans mon post précédent aurait aussi bien marché.
    Je suis d'accord sur la gestion des espaces. Mais mon principal problème était, qu'avant d'utiliser une variable de type varying, une ville contenant une apostrophe me faisait planter ma requête alors qu'avec "Paris" par exemple cela marchait. C'est en voulant améliorer ma "gestion des espaces" que j'ai résolu mon problème d'apostrophe...

    Le fait est que je débute tout juste en RPGLE. J'ai commencé à taquiner un peu le monstre avant de suivre une formation au langage et donc de le découvrir plus en avant dont le "varying". Le varying m'a semblé alors mieux qu'un trim et la définition d'une nouvelle variable de recherche pour faire ma requête et du coup j'ai résolu mon problème d'apostrophe.

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

Discussions similaires

  1. [XL-2003] Problème sur une sélection puis séparation par une ligne blanche
    Par korni184 dans le forum Excel
    Réponses: 12
    Dernier message: 08/04/2010, 11h45
  2. Réponses: 4
    Dernier message: 16/06/2005, 15h37
  3. Problème de select sur une date (DATETIME....)
    Par zeldoi5 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/05/2005, 11h19
  4. probléme de cadre sur une image qui me sert de lien
    Par thomas_chamas dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/11/2004, 17h36
  5. Problème de chaine sur une page HTML
    Par Kerod dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/11/2004, 16h23

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