Loops in PostgreSQL

Kampfgummibaerlie

Datenbank-Guru
Beiträge
734
Nachdem ich hier im Forum bereits viel über PostgreSQL lernen durfte, und, auch wenn ich es nicht aktiv brauche, würde mich der Punkt "Loops" näher interessieren.

Meine ersten Fragen dazu sind:
1.: wenn ich einen Loop in einer Function schreibe, benötige ich dann als language plpgsql?
2.: wie könnte ich "mir selbst" eine generate_series function schreiben?
3.: habt ihr irgendeine Idee wie ich das bei praktischen Beispielen ausprobieren könnte?

Ich kann mich an mein Beispiel erinnern, mit alle Uhrzeiten vom Tag, bezüglich der damaligen Lösung, welche einwandfrei funktioniert möchte ich jedoch noch näher etwas über Loops lernen.

Bin gespannt, was unserem Doktor Elephant wiedereinmal als Ansatz einfällt :D
(Ja, ich weiß, Loops habe ich schon des Öfteren angesprochen, doch ist es für mich noch nicht wirklich geklärt...)

Meine Ansatzideen wären:
Einen Loop in eine Function integrieren, und selber eine generate_series Funktion schreiben :O
Einen Loop in eine View einbauen, wofür weiß ich noch nicht, aber wird bestimmt auch irgendwann gebraucht xD und wenn nicht, würde es mich dennoch interessieren :)
 
Werbung:
Es ist löblich, dass Du Dich da weiter vertiefen willst.

Als kleine Warnung: wenn man bei SQL Abfragen in Schleifen denkt, dann ist man fast immer auf dem falschen Dampfer.

"Eine Schleife in eine View einbauen" ist mit an Sicherheit grenzender Wahrscheinlichkeit der falsche Ansatz.

SQL ist eine deklarative Sprache, keine prozedurale. Und Schleifen sind nun mal Teil von prozeduralen Sprachen.

generate_series() ist ein Beispiel wo eine Schleife Sinn macht - aber das ist letztendlich ja prozeduraler Code (auch wenn es in SQL ganz ohne Schleifen machbar wäre)
 
Ich schließe mich Castorp an. Man will keine Loops „programmieren“ in SQL. Noch dazu bei so schönem Wetter. Das passt besser zu Regen und Matsche.

Loops sind kein „natural fit“ für SQL, kein „best practice“.
Loops gibt es in relationalen Datenbanken sozusagen immanent, geschenkt, in Form unterschiedlich großer Mengen.

2.
Alte Rezepte (von Systemen die kein generate_series kennen oder kannten, es gibt massig solcher Verfahren als Workaround im Netz)
Select * from (
Select 1
union all
Select 2) loop2x *

Create view loop2x as
Select * from (
Select 1 as l
union all
Select 2) x

Select * from loop2x

Select x.* from loop2x x, loop2x y

Das Zahlenaufundab bei mehrfacher Permutation kann man nnotfalls durch Ausgabe von RowNumber() glatt bügeln.
Die benötgte Menge durch eine Where Clause einschränken.
Die verfügbare Menge durch hinreichend viele Permutationen bestimmen.
Dann hat man ohne Programmierung ein generate_series mit einem sehr natürlichen Verhalten. (Sicher nicht so performant/effizient wie generate_series)

3.
Du könntest eine „Looping“ Function schreiben. ;) (bei Regen)
Sie gibt eine fortlaufend steigende Zahl aus plus einer zyklisch steigenden. Damit könnte man auf einen Schlag Mengen mit (variablen)Untermengen erzeugen:
looping(10,random()*4+1)
1,1
2,2
3,3
4,1
5,2
6,1
7,1
8,2
9,3
10,4



* welche Zahlen/was ausgegeben wird, ist da oben eigentlich erstmal wurscht.
 
Als kleine Warnung: wenn man bei SQL Abfragen in Schleifen denkt, dann ist man fast immer auf dem falschen Dampfer.

Es gibt einige Szenarien, in denen Lateral Joins eine sinnvolle Alternative zu normalen Joins sind:

PostgreSQL’s LATERAL JOIN
PostgreSQL's Powerful New Join Type: LATERAL - Heap

Ich verstehe es zwar so, dass die Frage auf einen anderen Aspekt abzielt (Daten generieren), aber das, was man typischerweise neben dem Generieren von Daten mit einem Loop erreichen möchte, lässt sich mit einem Lateral Join erreichen.
Aber ich denke, wenn man seine PG-Kenntnisse auf das nächste Level bringen will, dann ist es sicher nicht falsch, Lateral Joins zu kennen :)

Aber im Prinzip passt die Warnung trotzdem noch.

PS: Hallo, das ist mein erster Post hier.
 
Werbung:
Zurück
Oben