Page 1 sur 2

requete select : probleme de virgule et de point

Posté : 27 janv. 2007, 00:16
par HD
salut
j ai une requete :
$sql ="SELECT reference FROM data WHERE poids >= $poidsmin";
le problème c'est que les poids que j'ai dans la base sont avec des , genre "2,01" alors que la condition >= ne marche que quand les chiffres sont avec des . genre "2.01"
comment faire donc pour executer cette requete sans modifier les données de la table data (j'ai pensé à str_replace mais avec une requete ayant la condition >= je ne vois pas comment faire) ?
merci d'avance pour votre aide

Re: requete select : probleme de virgule et de point

Posté : 27 janv. 2007, 00:50
par ovide
salut
j ai une requete :
$sql ="SELECT reference FROM data WHERE poids >= $poidsmin";
le problème c'est que les poids que j'ai dans la base sont avec des , genre "2,01" alors que la condition >= ne marche que quand les chiffres sont avec des . genre "2.01"
comment faire donc pour executer cette requete sans modifier les données de la table data (j'ai pensé à str_replace mais avec une requete ayant la condition >= je ne vois pas comment faire) ?
merci d'avance pour votre aide
Tu as tenté ça ?
$sql ="SELECT reference FROM data WHERE poids >= '$poidsmin'";

Posté : 27 janv. 2007, 00:59
par albat
la fonction number_format() ! :idea:

Posté : 27 janv. 2007, 01:12
par HD
la fonction number_format() ! :idea:
une fonction très utile mais comment l'utiliser avec ma requete sql ? car je ne veux pas récupérer tous les poids (des milliers), les convertir avant de comparer avec poidsmin...

Posté : 27 janv. 2007, 10:41
par albat
Ben, c'est tout bête !
$sql = "SELECT reference FROM data WHERE poids >= ".number_format($poidsmin, <PARAMÈTRES> );

Posté : 27 janv. 2007, 10:43
par mojorisin
Salut,
essais avec cette requete :
SELECT reference FROM data WHERE ( REPLACE(poids,',','.') +0.0 ) >= $poidsmin

Explication :
On remplace la virgule par un point ensuite on ajoute 0.0 pour forcer la convertion de la chaine en type float.
Ensuite la comparaison peut être effectuée.

Posté : 27 janv. 2007, 10:54
par albat
Attention !
Si une fonction doit être appliqué à une valeur (calcul, formatage, etc.),
toujours appliquer cette fonction à la valeur de référence
plutôt qu'au champ de la table à comparer.

En effet, appliquer un traitement sur un champ de la table :non:
fait perdre tout le bénéfice des index de cette table.

Posté : 27 janv. 2007, 10:56
par albat
ovide, mojorisin,

Vos propositions ont pour effet de transformer une valeur numérique en chaines de caractères.
C'est lourd en ressources, pénalisant et risque de provoquer des erreurs. :non:

Posté : 27 janv. 2007, 11:05
par mojorisin
Ha je ne savais pas cela :)

Comme quoi il vaut mieux mourrir le soir, on en apprend tous les jours :)

Sinon comme la on compare des chaines (si on ne cast pas le champs) n'y a t-il pas des risques de mauvaise comparaison ?
Avec des types négatif par exemple WHERE champs <= '-1,5'

Posté : 27 janv. 2007, 11:12
par albat
Risque d'erreurs, en effet.
Il faudrait tester quelques valeurs significatives pour en vérifier les effets.

De manière générale :
- le type de données le plus léger à manipuler est le numérique,
- le plus de données le plus lourd à manipuler est la chaîne de caractères
(j'ai pas dit "le plus chiant". Ça, c'est les date/time) ;)

Donc, quand on a la chance d'avoir des données numériques,
ne surtout pas les transformer en chaînes de caractères.

Posté : 27 janv. 2007, 12:29
par HD
Ben, c'est tout bête !
$sql = "SELECT reference FROM data WHERE poids >= ".number_format($poidsmin, <PARAMÈTRES> );
j avais pas pensé à çà c'est très utile !
par contre je crois que je me suis mal fait comprendre :
$poidsmin est bien formatée : "2.01" par exemple
c'est le champs "poids" (dans la base de données) qui est mal formaté (des chiffres avec virgules)
donc je ne veux pas modifier quoi que ce soit dans la BD et je ne veux pas récupérer tous les poids (des milliers), les convertir avant de comparer avec poidsmin.
Quelle est donc la solution ?
merci ![/b][/color]

Posté : 27 janv. 2007, 12:38
par albat
Je ne vois vraiment pas en quoi la solution que je t'ai proposée te pose problème ! :shock:

À moins que...

Dans quel type est déclaré ton champ poids de ta table data ? :-k



PS : le choix de data pour nommer ta table n'est pas des plus judicieux.
Car si data n'est pas un mot réservé, ce n'en est pas loin...

Posté : 27 janv. 2007, 12:41
par HD
ok pour data
sinon justement le problème est que "poids" est un champs "varchar" :(

Posté : 27 janv. 2007, 12:47
par albat
justement le problème est que "poids" est un champs "varchar" :(
T'es pas dans la merde... #-o

Posté : 27 janv. 2007, 12:50
par HD
:roll:
mais bon il me reste toujours la solution que je voulais à tout prix éviter :
je ne veux pas récupérer tous les poids (des milliers), les convertir avant de comparer avec poidsmin.
:evil: