Bonjour à tous,

Je cherche depuis ce matin la réponse à un probleme qui peut paraitre très simple mais dont personne ne parle nul part.


Voici ma table:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 
-- Structure de la table `test`
-- 
 
CREATE TABLE `test` (
  `chmp1` int(11) NOT NULL,
  `chmp2` decimal(5,2) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
 
-- 
-- Contenu de la table `test`
-- 
 
INSERT INTO `test` (`chmp1`, `chmp2`) VALUES 
(2, 1.50),
(3, 1.50);

J'execute la requete suivante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
select IF((SELECT SUM( `test`.`chmp1` * `test`.`chmp2` ) 
FROM `test`)<=>NULL,0,(SELECT SUM(`test`.`chmp1` * `test`.`chmp2`) FROM `test`)) as `resultat`;
Normalement le résultat devrait être 7.50. Pourtant on obtient 8 !!
On obtient 7.5 si on effectue la SUM sans le SELECT IF.
J'en déduis que le SELECT IF effectue un arrondis.
Comment l'en empecher?

PS: petite précision sur la syntaxe des arguments du select if:

SELECT IF(_comparaison, _résultat1 si _comparaison vrai, _résultat2 si _comparaison fausse)

Remarque: Si on remplace _résultat2 par la requête simple: (select 1+1.5) on remarque que le résultat sera 2.5.
Donc l'arrondis ne se fait que dans le cas du binome
SELECT IF(SELECT SUM());

Pourquoi? Comment l'éviter?

l'opérateur <=> NULL retourne Vrai si le résultat est null.

Merci pour toute piste ou conseil.