cs_Stubbornman
Messages postés80Date d'inscriptionlundi 18 février 2002StatutMembreDernière intervention12 janvier 2007 15 févr. 2006 à 21:09
aieeeuuuuu, je tiens a te remercier une nouvelle fois pour ta reponse, elle me fut d'une grande aide.
Pour ceux qui seraient confrontés au même problème, voici une méthode qui fonctionne:
SELECT * FROM tableWHERE UPPER(LEFT(colonne,1)) BETWEEN 'A' AND 'E'";
Ceci fonctionne très bien, et rend mon code nettement plus lisible. Je n'ai pas essayé l'autre méthode, celle-ci me satisfaisant grandement.
bigondas
Messages postés31Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 5 septembre 2006 19 déc. 2005 à 10:21
SELECT * FROM table WHERE colonne LIKE '[A-E]%' ORDER BY colonne ASC
essai celle là
ton pbm viens peut être du faire k'il y a deux fois la même instruction dans ta requête, SQL ne tiens pas compte des majuscules et des minuscules il me semble
cs_Stubbornman
Messages postés80Date d'inscriptionlundi 18 février 2002StatutMembreDernière intervention12 janvier 2007 27 déc. 2005 à 18:07
J'ai cherché sur différents sites dont sqlfr.com et mysql.com mais pas moyen de trouver de solution à mon problème.
Et le problème justement je ne le connais pas... Mon idée était de créer une requête plus simple (et plus compréhensible par la même occasion) en remplaçant une instuction de 3 lignes par une plus simple qui tient sur une ligne:
de :
"SELECT * FROM table WHERE colonne LIKE 'a%' OR colonne LIKE 'b%' OR colonne LIKE 'c%' OR colonne LIKE 'd%' OR colonne LIKE 'e%' OR colonne LIKE 'A%' OR colonne LIKE 'B%' OR colonne LIKE 'C%' OR colonne LIKE 'D%' OR colonne LIKE 'E%';"
passer à :
"SELECT * FROM table WHERE colonne LIKE '[a-e]%' OR colonne LIKE '[A-E]%';"
Le problème, c'est qu'il n'y a pas de problème. Dans le premier cas, la base me retourne des élèments, dans le second cas aucun élèment retourné, et aucune erreur non plus.
Pour info j'utilise hsqldb, mais à part ça, je ne sais pas ce qu'il convient d'indiquer pour faciliter votre compréhension...
J'ai testé en remplaçant les ' par " mais la ça me retourne une erreur (je n'ai pas oublié de mettre " et non ", evidemment ):
SQLException: Column not found: [A-E]% in statement [SELECT * FROM recipes WHERE title LIKE "[A-E]%"]
SQLState: S0022
VendorError: -28
Dans ce cas, c'est un problème de syntaxe de la requête, mais je ne sais pas où...
Ensuite j'ai essayé avec REGEXP de la façon suivante:
"SELECT * FROM table WHERE colonne REGEXP '^[a-e]' OR colonne REGEXP '^[A-E]';"
Là encore une erreur m'est retournée, mais je ne la comprends pas plus:
SQLException: NULL value as BOOLEAN
SQLState: S1000
VendorError: -106
Voilà, mon obstination a des limites, tout comme mes connaissances en base de données...
Merci d'avance pour votre aide.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Stubbornman
Messages postés80Date d'inscriptionlundi 18 février 2002StatutMembreDernière intervention12 janvier 2007 18 janv. 2006 à 23:01
Oui, j'ai bien lu ton poste, mais j'voulais être sur que vous ayez tous compris mon problème.... (je trouvais personnellement que je n'avas pas été très clair dans mesexplications).
Donc pour les LIKE, en effet, y'a aucune chance pour que ca fonctionne.
Pour ce qui est des expressions régulières, je ne sais pas les utiliser... J'ai bien essayé, mais j'vois pas comment ça marche...
Enfin, concernante SGBDR (heu, si j'ai bien compris ce que c'était...) j'utilise une bibliothèque Java qui s'appelle hsqldb. J'espère que c'est de ça que tu parle.
Voilà, je n'ai tjs pas trouvé de solution, et je reste donc avec mon code sur plusieurs lignes, jusqu'à ce que je trouve mieux...
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 19 janv. 2006 à 12:15
re,
le SGBDR, c'est le Systeme de Gestion de Base de Données Relationnel
exemple : Oracle, SQL Server, MySQL
dans ton cas, au vu des messages d'erreur, il me semble que tu utilise MySQL
alors pour utiliser les expressions réguliere, je ne suis pas sur du tout que ca soit possible
il faut donc contourner ton probleme.
une solution serait de ne prendre que la premiere lettre de ton champs, la mettre en majuscule, et de voir si elle se trouve entre deux bornes : (mettre en majuscule te permet de ne faire qu'une seule verification, au lieu d'en faire une en minuscule et une en majuscule)
SELECT * FROM table WHERE UPPER(LEFT(Colonne, 1)) BETWEEN 'A' AND 'E'
je n'ai pas MySQL pour tester, mais sous SQL Server ca marche.
si ca ne marche pas, tu peux faire aussi
SELECT * FROM table WHERE UPPER(LEFT(Colonne, 1)) IN ('A','B','C','D','E')
ou meme (en fonction de tes besoins) créer une table qui contient ces lettres et faire une sous requete dans cette table a la place du IN:
IN(SELECT * FROM maNouvelleTable)
avec ca je pense que tu devrais pouvoir y arriver.
note que je ne suis pas sur de la syntaxe sous MySQL pour le UPPER (mise ne majuscule) et le LEFT(prendre les n premiers caracteres de gauche, ici un seul caractere en fait). je pense que ca devrait etre implementé de la meme facon, mais si ca ne fonctionn pas, cherche l'equivalent pour MySQL
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 1 févr. 2006 à 18:00
re,
juste un petite precision.
je reviens sur ce que je dis.
effectivement l'utilisation de [a-e] est tout a fait valide. je n'avais jamaisvu son utilisation.
autant pour moi !
cela dit ca n'explique pas pourquoi ta requete ne fonctionne pas, mais c'etait juste pour corriger mon erreur :)
PS : reste a verifier que cette syntaxe est bien acceptée par MySQL, et verifie aussi si il n'y a pas des restriction a son utilisation, en ce qui concerne les types des champs visés. Les champs de type CHAR renvoie des resultats innatendus du fait qu'ils "rajoutent" des espaces blancs a la fin des chaines de caracteres pour arriver a la longeur definie
cs_Stubbornman
Messages postés80Date d'inscriptionlundi 18 février 2002StatutMembreDernière intervention12 janvier 2007 10 févr. 2006 à 16:24
aieeeuuuuu, je tiens a te remercier pour ta reponse. Je n'ai pas encore eu le temps de verifier, mais si ca marche je pense que j'utiliserais la methode du Upper sur la premiere lettre, ce qui permettra a mon code d'etre bcp plus lisible.