Учитывая эту настройку в текущем Postgres 9.4 ( из этого связанного вопроса ):
CREATE TABLE foo (ts, foo) AS
VALUES (1, 'A') -- int, text
, (7, 'B');
CREATE TABLE bar (ts, bar) AS
VALUES (3, 'C')
, (5, 'D')
, (9, 'E');
Существует также SQL Fiddle из предыдущего вопроса.
Я написал SELECT
с, FULL JOIN
чтобы достичь цели упомянутого вопроса. Упрощенная:
SELECT ts, f.foo, b.bar
FROM foo f
FULL JOIN bar b USING (ts);
Согласно спецификациям, правильный способ обращения к столбцу ts
без указания таблицы. Любое из входных значений ( f.ts
или b.ts
) может быть NULL. Предложение USING
создает немного странный случай: ввод столбца «input», который на самом деле отсутствует во входных данных. Пока все так элегантно.
Я положил это в функцию plpgsql. Для удобства (или требований) я хочу использовать одинаковые имена столбцов для результата табличной функции. Поэтому мы должны избегать конфликтов имен между одинаковыми именами столбцов и параметрами функций. Лучше всего избегать, выбирая разные имена, но мы здесь:
CREATE OR REPLACE FUNCTION f_merge_foobar()
RETURNS TABLE(ts int, foo text, bar text) AS
$func$
BEGIN
FOR ts, foo, bar IN
SELECT COALESCE(f.ts, b.ts), f.foo, b.bar
FROM foo f
FULL JOIN bar b USING (ts)
LOOP
-- so something
RETURN NEXT;
END LOOP;
END
$func$ LANGUAGE plpgsql;
Жирный акцент, чтобы подчеркнуть проблему . Я не могу использовать без квалификации таблицы, как раньше, потому что plpgsql вызовет исключение (не строго необходимо, но, вероятно, полезно в большинстве случаев):ts
ERROR: column reference "ts" is ambiguous LINE 1: SELECT ts, f.foo, b.bar ^ DETAIL: It could refer to either a PL/pgSQL variable or a table column.
Я знаю, что могу использовать разные имена или подзапрос или использовать другую функцию. Но мне интересно, есть ли способ ссылаться на колонку. Я не могу использовать таблицу квалификации. Казалось бы, должен быть способ.
Есть?