Как заставить мой UDF Amazon Redshift получать строку вместо списка?

Я создал эту функцию, чтобы получить listagg() в качестве параметра и удалить дубликаты.

create or replace function reports.f_listagg_distinct (l varchar(20000))
    returns varchar(20000)
immutable
as $$
aux_list = l.split(',')
nl = []
for i in aux_list:
    if i not in nl:
        nl.append(i)
return nl
$$ language plpythonu;

Когда я запускаю код ниже, я получаю эту ошибку: TypeError: expected string or Unicode object, list found

select reports.f_listagg_distinct('teste,teste,teste');

Что я делаю не так?


person Lucas Rezende    schedule 25.11.2016    source источник


Ответы (1)


Если вы хотите вернуть отдельный список объектов, разделенных запятыми, используйте эту функцию из удалить дубликаты из строки, разделенной запятыми (Amazon Redshift):

CREATE FUNCTION f_uniquify (s text)
  RETURNS text
IMMUTABLE
AS $$
  -- Split string by comma, remove duplicates, convert back to comma-separated
  return ', '.join(set(s.split(',')))
$$ LANGUAGE plpythonu;

Тестирование с помощью:

select f_uniquify('test,teste,tester,teste,test');

Возвращает:

test, teste, tester
person John Rotenstein    schedule 26.11.2016