requete select : probleme de virgule et de point

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : requete select : probleme de virgule et de point

par HD » 27 janv. 2007, 13:52

ok merci à tous pour votre aide !

par albat » 27 janv. 2007, 12:50

Effectivement, avec cette nouvelle contrainte,
la solution de mojorisin devient envisageable.
Mais c'est vraiment pas propre !

L'idéal serait de créer une nouvelle table, data_num par exemple,
copie de ta table data, mais dans laquelle tu auras transformé
le champ poids en type numérique en recopiant les valeurs.

À toi de voir...

par HD » 27 janv. 2007, 12:50

: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:

par albat » 27 janv. 2007, 12:47

justement le problème est que "poids" est un champs "varchar" :(
T'es pas dans la merde... #-o

par HD » 27 janv. 2007, 12:41

ok pour data
sinon justement le problème est que "poids" est un champs "varchar" :(

par albat » 27 janv. 2007, 12:38

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...

par HD » 27 janv. 2007, 12:29

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]

par albat » 27 janv. 2007, 11:12

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.

par mojorisin » 27 janv. 2007, 11:05

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'

par albat » 27 janv. 2007, 10:56

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:

par albat » 27 janv. 2007, 10:54

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.

par mojorisin » 27 janv. 2007, 10:43

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.

par albat » 27 janv. 2007, 10:41

Ben, c'est tout bête !
$sql = "SELECT reference FROM data WHERE poids >= ".number_format($poidsmin, <PARAMÈTRES> );

par HD » 27 janv. 2007, 01:12

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...

par albat » 27 janv. 2007, 00:59

la fonction number_format() ! :idea: