Как перебрать массив строк и создать несколько таблиц в Postgresql - PullRequest
0 голосов
/ 25 июня 2018

Я хотел бы взять большой стол и разбить на более мелкие. У меня есть следующий фрагмент кода, который работает путем ручной замены "NAME" уникальным именем в ui00000bvbb.lad15nm:

   CREATE TABLE "NAME" AS
   SELECT parcels_all_shapefile.* AS parcels
   FROM ui00000bvbb INNER JOIN parcels_all_shapefile ON ST_Intersects(ui00000bvbb.wkb_geometry, parcels_all_shapefile.wkb_geometry)
   WHERE ui00000bvbb.lad15nm = "NAME")

У меня вопрос, как я могу просмотреть список имен и заполнить приведенный выше код? Я пробовал следующее, но это не работает:

DO
$do$
DECLARE
   m   varchar[];
   arr varchar[] := array[['Barnet'],['Westminster']];
BEGIN
   FOREACH m SLICE 1 IN ARRAY arr
   LOOP
       CREATE TABLE m AS
       SELECT parcels_all_shapefile.* AS parcels
       FROM ui00000bvbb INNER JOIN parcels_all_shapefile ON ST_Intersects(ui00000bvbb.wkb_geometry, parcels_all_shapefile.wkb_geometry)
       WHERE ui00000bvbb.lad15nm = m)
   END LOOP;
END
$do$

1 Ответ

0 голосов
/ 25 июня 2018

Переменная цикла должна быть просто text.Используйте простой цикл FOREACH (без SLICE) и динамический SQL EXECUTE внутри цикла:

DO
$do$
DECLARE
    m   text;
    arr text[] := array['Barnet','Westminster'];
BEGIN
   FOREACH m IN ARRAY arr
   LOOP
        EXECUTE format($fmt$
            CREATE TABLE %1$I AS
            SELECT parcels_all_shapefile.* AS parcels
            FROM ui00000bvbb INNER JOIN parcels_all_shapefile ON ST_Intersects(ui00000bvbb.wkb_geometry, parcels_all_shapefile.wkb_geometry)
            WHERE ui00000bvbb.lad15nm = %1$L
        $fmt$, m);
   END LOOP;
END
$do$

Читайте также в документации:

...