Pourquoi pas de variable dans SELECT ?
Salut
Juste une question...
Pourquoi le SELECT ne peut pas prendre de variable?:question:
Une idée de la forme...
Code:
1 2 3 4 5
| SELECT colx, coly, varx, vary,...
VAR varx=expression, vary=expression2
FROM...
WHERE <prédicat sur colonnes>
HAVING <prédicat sur variable> |
dans laquelle VAR serait une clause optionnelle de l'instruction SELECT.:idea:
Le code que je donne est assez simpliste, mais pensez aux requêtes complexes dans lesquelles on a souvent des répétitions d'expression qu'on voudrais factoriser.
Au passage, MySQL accepte un alias dans le having du genre...
Code:
SELECT left(prenom,2) AS initial FROM personne HAVING initial='AL'
Alors pourquoi pas?:question:
@+
solution magique avec JOIN LATERAL
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...
Code:
create table seconddegre(id serial primary key, a int, b int, c int);
Insertion de trois lignes...
Code:
insert into seconddegre(a, b, c) values(1,1,-1),(1,0,-1),(1,-1,-2),(1,1,1);
La requête standard...
Code:
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...
Code:
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...
Code:
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