PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres FOR LOOP

Verfahrensweise Elemente wie Schleifen sind nicht Teil der SQL-Sprache und können nur innerhalb des Körpers einer prozeduralen Sprachfunktion, einer Prozedur (Postgres 11 oder höher) oder eines DO verwendet werden Erklärung, wenn solche zusätzlichen Elemente durch die jeweilige Verfahrenssprache definiert sind. Der Standard ist PL/pgSQL, aber es gibt noch andere.

Beispiel mit plpgsql:

DO
$do$
BEGIN 
   FOR i IN 1..25 LOOP
      INSERT INTO playtime.meta_random_sample
         (col_i, col_id)                       -- declare target columns!
      SELECT  i,     id
      FROM   tbl
      ORDER  BY random()
      LIMIT  15000;
   END LOOP;
END
$do$;

Für viele Aufgaben, die mit einer Schleife gelöst werden können, gibt es eine kürzere und schnellere Set-basierte Lösung um die Ecke. Reines SQL-Äquivalent für Ihr Beispiel:

INSERT INTO playtime.meta_random_sample (col_i, col_id)
SELECT t.*
FROM   generate_series(1,25) i
CROSS  JOIN LATERAL (
   SELECT i, id
   FROM   tbl
   ORDER  BY random()
   LIMIT  15000
   ) t;

Über generate_series() :

  • Was ist das erwartete Verhalten für mehrere Set-zurückgebende Funktionen in der SELECT-Klausel?

Über die Optimierung der Leistung von Zufallsauswahlen:

  • Bester Weg, zufällige Zeilen PostgreSQL auszuwählen