PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Postgres FOR LOOP

Процедурни елементи като цикли не са част от SQL езика и могат да се използват само в тялото на функция на процедурен език, процедура (Postgres 11 или по-нова версия) или DO изявление, когато такива допълнителни елементи са дефинирани от съответния процедурен език. По подразбиране е PL/pgSQL, но има и други.

Пример с 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$;

За много задачи, които могат да бъдат решени с цикъл, има по-кратък и по-бързбазиран на набор решение зад ъгъла. Чист SQL еквивалент за вашия пример:

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;

Относно generate_series() :

  • Какво е очакваното поведение за множество функции, връщащи набор в клауза SELECT?

Относно оптимизирането на производителността на произволни селекции:

  • Най-добрият начин за избор на произволни редове PostgreSQL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дълбоко гмуркане на доставчик на облак:PostgreSQL на Microsoft Azure

  2. ORDER BY ... USING клауза в PostgreSQL

  3. Подаване на име на таблица като параметър в psycopg2

  4. Класът не е намерен, зарежда JDBC org.postgresql.Driver

  5. Вземете името на деня от дата в PostgreSQL