2016-11-02 6 views
0

Я пытаюсь выполнить профилирование данных с помощью функции Postgres. Я пробовал функцию ниже, что приводит к ошибке. Поскольку я новичок в функциях базы данных, процедурах и т. Д. Мне трудно найти эту проблему.Профилирование данных с использованием функции PostgreSQL

Фактическая работа:

Я хочу, чтобы перебрать все столбцы в таблице и выполнять данные профилирования, т.е. граф, граф отчетливые аннулирует, не аннулирует для символьных столбцов. Min, Max для цифр & даты столбцов. Пожалуйста помогите

CREATE OR REPLACE FUNCTION data_profiling (TABLE_VALUE VARCHAR) 
RETURNS TABLE (
col_value VARCHAR, 
DISTINCT_COUNT INT 
) 
AS $$ 
DECLARE 
    var_c Varchar; 

BEGIN 
    FOR var_c IN(SELECT c.column_name,c.table_name 
     FROM information_schema.columns c 
     WHERE lower(c.table_name) = TABLE_VALUE) 
    LOOP 
RETURN QUERY EXECUTE 'SELECT ' || var_c ||' as col_name, count(distinct ' || var_c ||') as distinct_count 
FROM ' || TABLE_VALUE || ' group by ' || var_c; 
      END LOOP; 
END; $$ 
LANGUAGE 'plpgsql'; 

Ошибка:

ERROR: structure of query does not match function result type 
DETAIL: Returned type character(50) does not match expected type character varying in column 1. 
CONTEXT: PL/pgSQL function data_profiling(character varying) line 10 at RETURN QUERY 

ответ

1

Курсор возвращает запись а не VARCHAR, что вам нужно измените свою декларацию на:

var_c record; 

В записи будет столько полей, сколько вы включаете столбцы в списке выбора, к каждому из которых можно обратиться по имени столбца. Также лучше использовать функцию format() для генерации динамического SQL.

count() также возвращает bigint не int. Вам также нужно указать выбранный столбец varchar, иначе вы не сможете вернуться, например. целочисленное значение в качестве первого столбца.

CREATE OR REPLACE FUNCTION data_profiling (table_value varchar) 
    RETURNS TABLE (col_value varchar, distinct_count bigint) 
AS 
$$ 
DECLARE 
    var_c record; 
BEGIN 
    FOR var_c IN (SELECT c.table_schema, c.column_name,c.table_name 
       FROM information_schema.columns c 
       WHERE lower(c.table_name) = TABLE_VALUE 
        and c.table_schema = 'public') 
    LOOP 
     RETURN QUERY EXECUTE 
     format('SELECT %I::varchar, count(distinct %I) FROM %I.%I group by %I', 
       var_c.column_name, var_c.column_name, var_c.table_schema, var_c.table_name, var_c.column_name); 
    END LOOP; 
END; $$ 
LANGUAGE plpgsql; 

Заполнитель %I (столица i) будет заботиться о правильно указав имя столбца или таблицы, если это необходимо. Вы также должны убедиться, что вы указали имя схемы.

Языковое имя является идентификатором, не помещайте его в одинарные кавычки.

Вам также не нужно указывать псевдоним столбца в сгенерированном SQL, поскольку имена выходных столбцов определяются частью returns table (..). Это делает код немного легче читать.

0

Вы должны объявить длину для возврата таблицы

RETURNS TABLE (
    col_value VARCHAR(8000), 
    DISTINCT_COUNT INT 
+1

Нет, это не обязательно. –

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

  • Нет связанных вопросов^_^