Bonjour,
J'ai un souci sur une requête sur une table contenant 3 colonnes (colA, colB, colC).
Je souhaite faire un SELECT en ordonnant selon colB / colC où:
- colC peut être égal à 0,
- il faut donc éviter la division par zero,
- colB =< colC,
- colB et colC >=0.
De sorte que le résultat colB / colC est toujours compris entre 0 et 1.
Mes données de test sont:
Le résultat devrait être (classé par colA):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 # Mytable(i,j,k) correspond à INSERT Mytable(colA, colB, colC) VALUES(i,j,k) e0 = Mytable(0, 0, 0) e1 = Mytable(1, 1, 0) e2 = Mytable(2, 2, 0) e3 = Mytable(3, 0, 10)# colB/colC = 0 e4 = Mytable(4, 1, 10)# colB/colC = 0.1 e5 = Mytable(5, 2, 10)# colB/colC = 0.2 e6 = Mytable(6, 2, 4)# colB/colC = 0.5 e7 = Mytable(7, 3, 4)# colB/colC = 0.75 e8 = Mytable(8, 3, 8)# colB/colC = 0.375 e9 = Mytable(9, 4, 8)# colB/colC = 0.5 e10 = Mytable(10, 5, 8)# colB/colC = 0.625
0,1,2,3,4,5,8,6 et 9,10,7
Précisions:
- je ne suis qu'un amateur,
- la base est sqlite,
- j'utilise sqlalchemy qui est un orm sous le langage python,
- je ne pense pas que NULLIF fonctionne sous sqlalchemy,
- Mes données sont des Float dans la base (NUMERIC(10,2))
- j'ai utilisé CASE, NULL, CAST,... sans succès.
Ex:
qui correspond à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 # En Python: mycase = cast(Mytable.colB,Float) / cast(case([(Mytable.colC==0,null())],else_=Mytable.colC),Float) Query = session.query(Mytable).order_by(asc(cast(mycase, Float)))
Une bonne âme pourrait-elle m'indiquer le select qu'il faut faire en langage SQL classique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT mytable.id AS mytable_id, mytable."colA" AS "mytable_colA", mytable."colB" AS "mytable_colB", mytable."colC" AS "mytable_colC" FROM mytable ORDER BY CAST(CAST(mytable."colB" AS NUMERIC(10, 2)) / CAST(CASE WHEN (mytable."colC" = ?) THEN NULL ELSE mytable."colC" END AS NUMERIC(10, 2)) AS NUMERIC(10, 2)) ASC 2008-06-27 11:59:21,875 INFO sqlalchemy.engine.base.Engine.0x..70 [0.0]
Je me débrouillerai pour l'adapter à sqlalchemy.
D'avance merci pour votre aide
Dominique
Partager