2012-05-20 5 views
3

Это в руководстве Postgres:

CREATE or replace FUNCTION mleast(a VARIADIC numeric[]) 
    RETURNS numeric 
AS $$ 
    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i); 
$$ LANGUAGE SQL; 

SELECT mleast(10, -1, 5, 4.4); 

, если я пишу: (ommiting г (я))

CREATE or replace FUNCTION mleast(a VARIADIC numeric[]) 
    RETURNS numeric 
AS $$ 
    SELECT min($1[i]) FROM generate_subscripts($1, 1); 
$$ LANGUAGE SQL; 


SELECT mleast(10, -1, 5, 4.4); 

я получаю: Ошибка не существует столбец «я»

Что такое g (i)?

ответ

6

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). Как только вы пишете их самостоятельно, становится понятнее, почему вам нужен псевдоним, чтобы ссылаться на его результаты.

+0

Спасибо a_horse_with_no_name. – fvel

+0

Спасибо, Джош, Теперь это очень ясно. Очень хорошо объяснил ответ. Спасибо @a_horse_with_no_name, вы правы. – fvel

1

g(i) определяет структуру таблицы (resultset), которая возвращается функцией generate_series().

Он назначает псевдоним g в результирующем с одного столбца с именем i

+0

Спасибо. Я ссылался на это: какое это выражение: вызов функции know: generate_subscripts ($ 1, 1) и следующий вызов неизвестной функции g (i). Я прочитал все о разделе FROM и никогда не обнаружил, что он может иметь две функции рядом друг с другом. – fvel

+0

@fvel: это не выражение, а вызов функции. Это псевдоним, который определяет структуру возвращаемой таблицы. –

Смежные вопросы