Hoewel ik eigenlijk tegen stored procedures ben, heb ik nu 1 situatie waar ik wel heel graag eentje wil gebruiken: voor een user-defined aggregate function. Ik zit een beetje te twijfelen, want ik heb er juist moeite voor gedaan om alle queries die ik heb zo clean mogelijk te houden. (wat geavanceerdere dingen doe ik dmv een eigen libje voor het dynamisch opbouwen van queries, waar ik dan via plug-ins client-side processing code aanhang, maar de uiteindelijk gegenereerde SQL die naar de DB gaat is zo puur mogelijk)
Waar het om gaat is een aggregate die waardes in een array stopt. Niks meer en niks minder.
Voor postgres zou het om de volgende functie gaan:
Zie: http://www.issociate.de/b...nction_with_Argument.html
Ik kan daar bv een query mee doen als:
Gegeven de tabel:
Zou het resultaat zijn:
Waarbij de comma's in kolom b even voor het printen erbij gezet zijn, maar het dus eigenlijk om een SQL Array gaat.
Een andere mogelijkheid die ik zag, maar die veel langzamer is, is de volgende:
Dit is een scalar subquery in combinatie met een array. De uitkomst is goed, de snelheid niet.
Wat vinden jullie van deze aanpak?
ps ik poste deze message ook al in de thread "Zeg nee tegen stored procedures", maar bij nader inzien is het toch meer een topic opzich. De post in de andere thread mag dan ook getrashed worden.
Waar het om gaat is een aggregate die waardes in een array stopt. Niks meer en niks minder.
Voor postgres zou het om de volgende functie gaan:
code:
1
2
3
4
5
6
| CREATE AGGREGATE array_accum ( sfunc = array_append, basetype = anyelement, stype = anyarray, initcond = '{}' ); |
Zie: http://www.issociate.de/b...nction_with_Argument.html
Ik kan daar bv een query mee doen als:
SQL:
1
2
3
| select a, array_accum(b) AS b from t1 group by a |
Gegeven de tabel:
code:
1
2
3
4
5
6
7
8
| t1 a | b ---------- 1 | x 1 | y 1 | z 2 | q 2 | w |
Zou het resultaat zijn:
code:
1
2
3
4
| a | b ----------- 1 | x, y, z 2 | q,w |
Waarbij de comma's in kolom b even voor het printen erbij gezet zijn, maar het dus eigenlijk om een SQL Array gaat.
Een andere mogelijkheid die ik zag, maar die veel langzamer is, is de volgende:
code:
1
| select a,ARRAY(SELECT b FROM t1 AS t2 WHERE t1.a = t2.a ) FROM t1; |
Dit is een scalar subquery in combinatie met een array. De uitkomst is goed, de snelheid niet.
Wat vinden jullie van deze aanpak?
ps ik poste deze message ook al in de thread "Zeg nee tegen stored procedures", maar bij nader inzien is het toch meer een topic opzich. De post in de andere thread mag dan ook getrashed worden.