PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres POUR LA BOUCLE

Procédure des éléments comme des boucles ne font pas partie du langage SQL et ne peuvent être utilisés que dans le corps d'une fonction de langage procédural, d'une procédure (Postgres 11 ou version ultérieure) ou d'un DO déclaration, où ces éléments supplémentaires sont définis par le langage procédural respectif. La valeur par défaut est PL/pgSQL, mais il y en a d'autres.

Exemple avec 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$;

Pour de nombreuses tâches qui peuvent être résolues avec une boucle, il existe une méthode basée sur un ensemble plus courte et plus rapide solution au coin de la rue. Équivalent SQL pur pour votre exemple :

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;

À propos de generate_series() :

  • Quel est le comportement attendu pour plusieurs fonctions renvoyant des ensembles dans la clause SELECT ?

À propos de l'optimisation des performances des sélections aléatoires :

  • Meilleur moyen de sélectionner des lignes aléatoires PostgreSQL