Nano Hash - криптовалюты, майнинг, программирование

Создание функции в Postgresql, которая не возвращает составные значения

Я учусь писать функции в Postgresql. Я определил функцию с именем _tmp_myfunction(), которая принимает id и возвращает таблицу (я также определяю тип объекта таблицы с именем _tmp_mytable)

-- create object type to be returned
CREATE TYPE _tmp_mytable AS (
    id      integer, 
    cost    double precision
    );

-- create function which returns query
CREATE OR REPLACE FUNCTION _tmp_myfunction(
    id    integer
    )
RETURNS SETOF _tmp_mytable AS $$
BEGIN  
  RETURN QUERY 
  SELECT
    sales.gid,
    cost  
  FROM 
    sales
  WHERE
    id = sales.gid;
  END;
$$ LANGUAGE plpgsql;

Это отлично работает, когда я использую один id и вызываю его, используя следующий подход:

SELECT * FROM _tmp_myfunction(402);

введите здесь описание изображения

Что я хотел бы сделать, так это вызвать его, но использовать столбец значений вместо одного значения. Однако, если я использую следующий подход, я получаю все значения таблицы в одном столбце, разделенные запятыми:

-- call function using all values in a column
SELECT _tmp_myfunction(t.id)
FROM transactions as t;

введите здесь описание изображения

Я понимаю, что могу получить тот же результат, если использую SELECT _tmp_myfunction(402); вместо SELECT * FROM _tmp_myfunction(402);, но я не знаю, как построить свою функцию таким образом, чтобы я не получал составные значения при передаче столбца значений.

10.12.2012

  • Просто обновил имена моих переменных, чтобы сделать это немного яснее (я изменил их, чтобы сделать свой вопрос более ясным, и пропустил, что будет конфликт). 11.12.2012
  • @ErwinBrandstetter Хотя вы можете вызвать функцию, возвращающую набор, в SELECT, поведение может быть действительно странным. Это устаревший хак для PostgreSQL, от которого следует отказаться, как только LATERAL в PostgreSQL 9.3 станет доступен для использования. Как странно, сравните SELECT generate_series(1,3), generate_series(1,3); с SELECT generate_series(1,3), generate_series(1,4); . 1-й возвращает три строки, пары результатов по порядку. Второй возвращает двенадцать строк, все возможные пары результатов, как векторное произведение. 11.12.2012

Ответы:


1

Вы можете написать что-то вроде этого:

SELECT (t2.function_row).id,
       (t2.function_row).cost
FROM (SELECT _tmp_myfunction(t.id) as function_row
     FROM transactions  t ) t2;

Это даст вам поля вместо составных строк.

10.12.2012
  • Обратите внимание, что PostgreSQL может многократно выполнять эту функцию для каждой строки, один раз за (func_row).column. Добавьте RAISE NOTICE к функции, чтобы понять, что я имею в виду. Поддержка LATERAL в версии 9.3 должна наконец исправить это. Есть статья depesz с подробностями и примерами, просто я не могу найти ее в данный момент. 11.12.2012
  • @Craig: Вы, вероятно, имеете в виду эту функцию. Мы тоже с нетерпением ждем этой функции. 12.12.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..