generate_subscripts является «возвращающих набор функций», которая будет возвращать несколько строк при вызове его. Вот почему он чаще всего помещается в предложение FROM.
По умолчанию результаты generate_subscripts, которые входят в состав Postgres, являются анонимными и автоматически используют любое имя для использования в качестве дескриптора, чтобы ссылаться на него в остальной части запроса. Это то, что g (i); это псевдоним для таблицы (g) и столбца (i), возвращаемого generate_subscripts. Таким образом, это выражение:
FROM generate_subscripts($1, 1) g(i)
означает:
выполнить функцию generate_subscripts и назначить его результаты в таблицу под названием "г" с одной колонке под названием "я"
или в форме SQL:
CREATE TABLE g (i integer);
INSERT INTO g SELECT * FROM generate_subscripts(some_array, 1);
SELECT i FROM g ORDER BY i;
Без этого псевдонима ВЫБРАТЬ часть вашего запроса не имеет ни малейшего представления о том, как ссылаться на результаты, полученные с помощью generate_subscripts.
Использование g (i) и gs (i) является конвенцией в мире Postgres. «g» или «gs» означает «generate_series» или «generate_subscripts». «i» - это традиционная переменная программирования для «итератора». Вы можете использовать любые псевдонимы, которые вы хотите, и я призываю вас использовать псевдонимы, которые на самом деле ссылаются на то, что вы пытаетесь сделать, чтобы улучшить дальнейшее обслуживание кода. Например:
FROM generate_subscripts($1, 1) as features(feature_no)
These functions are detailed in the PostgreSQL docs, и это также полезно ссылаться на docs on how to write Set Returning Functions (. Прокрутить вниз до 35.4.8 Функции SQL Возвратившись Sets). Как только вы пишете их самостоятельно, становится понятнее, почему вам нужен псевдоним, чтобы ссылаться на его результаты.
Спасибо a_horse_with_no_name. – fvel
Спасибо, Джош, Теперь это очень ясно. Очень хорошо объяснил ответ. Спасибо @a_horse_with_no_name, вы правы. – fvel