Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
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/11/2006, 12h32   #1
Membre régulier
 
Inscription : avril 2006
Messages : 118
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 118
Points : 72
Points : 72
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 :
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
_Jnie_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2006, 18h03   #2
Membre habitué
 
Inscription : septembre 2004
Messages : 123
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 123
Points : 127
Points : 127
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.
alex. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2006, 09h47   #3
Membre régulier
 
Inscription : avril 2006
Messages : 118
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 118
Points : 72
Points : 72
Citation:
Envoyé par alex.
Code :
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 )
_Jnie_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2006, 10h26   #4
Membre habitué
 
Inscription : septembre 2004
Messages : 123
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 123
Points : 127
Points : 127
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.
alex. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2006, 10h26   #5
Membre habitué
 
Inscription : septembre 2004
Messages : 123
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 123
Points : 127
Points : 127
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.
alex. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2006, 11h59   #6
Membre régulier
 
Inscription : avril 2006
Messages : 118
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 118
Points : 72
Points : 72
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.
_Jnie_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2006, 14h26   #7
Membre du Club
 
Inscription : août 2006
Messages : 56
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2006
Messages : 56
Points : 55
Points : 55
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.
ALHER est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2006, 16h31   #8
Membre régulier
 
Inscription : avril 2006
Messages : 118
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 118
Points : 72
Points : 72
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.
_Jnie_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 20h46   #9
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Par défaut Trim + Concat ?

Code :
LIKE TRIM(VilleRecherchée) CONCAT '%'
ne conviendrait-il pas ?
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 10h29   #10
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 11
Points : 11
Qu'est ce que ce Trim + Concat svp ?
Que va être le résultat de la requête ??
_Aim_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 11h49   #11
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

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

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
Tu peux utiliser la fonction Replac pour remplacer ' par '' dans la ville que tu cherche. Mais comment génères-tu ta commande SQL ?
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 13h50   #12
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Par défaut Trim() & Concat()

Code :
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 :
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...
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 14h41   #13
Membre régulier
 
Inscription : avril 2006
Messages : 118
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 118
Points : 72
Points : 72
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!
_Jnie_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 15h35   #14
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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é.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 16h01   #15
Membre régulier
 
Inscription : avril 2006
Messages : 118
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 118
Points : 72
Points : 72
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.
_Jnie_ 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 13h26.


 
 
 
 
Partenaires

Hébergement Web