Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Loops in PostgreSQL

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Kampfgummibaerlie, 1 Juni 2021.

  1. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    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 :)
     
  2. akretschmer

    akretschmer Datenbank-Guru

    1. ja, oder eine andere Sprache. SQL hat dafür keine Möglichkeiten. 42.6. Control Structures
    2. gib Dir Mühe, das ist eine nette Spielaufgabe
    3. pffft ...
     
  3. castorp

    castorp Datenbank-Guru

    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)
     
    Walter, akretschmer und Kampfgummibaerlie gefällt das.
  4. akretschmer

    akretschmer Datenbank-Guru

    full ack.
     
  5. dabadepdu

    dabadepdu Datenbank-Guru

    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.
     
  6. rkr__

    rkr__ Neuer Benutzer

    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.
     
    akretschmer und Walter gefällt das.
  7. akretschmer

    akretschmer Datenbank-Guru

    Absolut!

    Andreas
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden