Redshift: как создать функцию, которая использует таблицу поиска - PullRequest
1 голос
/ 09 июля 2019

У меня есть список.

Id int primary key,
Name varchar(100)

И я хочу создать функцию fnGetRoster (int), которая будет возвращать имя путем поиска в таблице Ростера.

Как это:

create or replace function fnGetRoster(int)
returns varchar(100)
stable
as $$
    select name from Roster where Id = $1
$$ language sql

Мне так трудно это сделать в RedShift, так как я не могу использовать откуда, где и т. Д.

Что я мог сделать? Я неправильно использовал функцию?

================== Недавно добавленная информация (после 1 ответа) ====================

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

Category
CatA : CatB : CatC : ..... : CatX

где другая таблица называется Категория

Id     ParentId      CategoryName 
-----+-------------+-----------------
1    |    NULL     | CatA
-----+-------------+-----------------
2    |    1        | CatB
-----+-------------+-----------------
3    |    2        | CatC
-----+-------------+-----------------
4    |    3        | CatD
-----+-------------+-----------------

Плохо то, что в этой таблице нет категории categoryID, поэтому мне нужно проанализировать всю строку, чтобы выяснить CategoryId. Я не могу использовать последнюю часть строки напрямую, поскольку нет гарантии, что имя уникально. (но есть гарантия, что полное название категории уникально). Я надеюсь написать функцию, которая может выполнять анализ, а затем выходит с идентификатором, но я обнаружил, что функции , похоже, предназначены для целей, отличных от RedShift ... Сейчас я борюсь с процедурами ... И я собираюсь переместить эту задачу переноса данных из Redshift (используйте ее только для сохранения результата)

1 Ответ

1 голос
/ 10 июля 2019

Вам потребуется создать хранимую процедуру в Amazon Redshift , а не скалярную пользовательскую функцию.

Однако, учитывая ваш вариант использования, это не рекомендуется. Это было бы неэффективно и привело бы к снижению производительности.

Вы должны использовать JOIN для получения таких данных, например:

SELECT
  something,
  roster.name
FROM other_table
JOIN roster ON (other_table.roster_id = roster.id)

Это будет высоко оптимизировано для выбора.

...