Salut
A force de chercher à vous convaincre de la pertinence, j'ai découvert une solution magique avec la jointure latérale (JOIN LATERAL).
L'exemple est fait sur la résolution d'équation du second degré.
Solution avec PostgreSQL
La table contenant les coefficients...
create table seconddegre(id serial primary key, a int, b int, c int);
Insertion de trois lignes...
insert into seconddegre(a, b, c) values(1,1,-1),(1,0,-1),(1,-1,-2),(1,1,1);
La requête standard...
1 2 3 4 5 6 7 8 9 10 11 12
| select b*b-4*a*c as delta,
(case
when b*b-4*a*c>=0 then
(-b-sqrt(b*b-4*a*c))/2*a
else null
end) as x1,
(case
when b*b-4*a*c>=0 then
(-b+sqrt(b*b-4*a*c))/2*a
else null
end) as x2
from seconddegre |
Le résultat...
delta |
x1 |
x2 |
5 |
-1.61803398874989 |
0.618033988749895 |
4 |
-1 |
1 |
9 |
-1 |
2 |
-3 |
|
|
La requête avec JOIN LATERAL...
1 2 3 4 5 6 7 8 9 10 11 12 13
| select delta,
(case
when delta>=0 then
(-b-rdelta)/2*a
else null
end) as x1,
(case
when delta>=0 then
(-b+rdelta)/2*a
else null
end) as x2
from seconddegre as sd
join lateral (select sd.b*sd.b-4*sd.a*sd.c as delta, sqrt(abs(sd.b*sd.b-4*sd.a*sd.c)) as rdelta) as d on true |
Le résultat...
delta |
x1 |
x2 |
5 |
-1.61803398874989 |
0.618033988749895 |
4 |
-1 |
1 |
9 |
-1 |
2 |
-3 |
|
|
Bonus..., on peut même filtrer avec WHERE...
Les équations qui on une solution...
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| select delta,
(case
when delta>=0 then
(-b-rdelta)/2*a
else null
end) as x1,
(case
when delta>=0 then
(-b+rdelta)/2*a
else null
end) as x2
from seconddegre as sd
join lateral (select sd.b*sd.b-4*sd.a*sd.c as delta, sqrt(abs(sd.b*sd.b-4*sd.a*sd.c)) as rdelta) as d on true
where delta>=0 |
Il reste à chercher pour les agrégations.
@+ et grand merci de vos contributions
Partager