Те, кто использует PostgreSQL в качестве сервера баз данных, очень часто пользуются такой программой как PGAdmin III — это средство администрирования данной СУБД. И, наверное, сталкивались с такой проблемой, как выгрузка дробных чисел в CSV в неправильном формате. Так как при выгрузке в PostgreSQL в качестве разделителя дробной части используется точка. И тем самым, если выгрузить данные в формат CSV и открыть, например, Excel, то у Вас некоторые числа будут иметь формат даты, за счет того, что Excel использует в качестве разделителя дробной части запятую, и Вам придется вручную все это дело проверять и исправлять, что не очень удобно.
Если Вы столкнулись с такой проблемой, я предлагаю один очень простой вариант, который поможет Вам выгрузить корректно дробные числа в формат CSV.
Примечание! Данный способ предполагает знание основ SQL, так как реализация будет осуществлена с помощью функции на plpgsql, которую мы сейчас напишем.
Как в PGAdmin III выгрузить данные в CSV?
Если Вы вообще не знаете, как осуществляется выгрузка в формат CSV, то она делается очень просто, пишите запрос в окне query, выполняете его, затем в меню выбираете «Файл -> Экспорт», далее появится следующее окно, заполните в соответствие с примером и жмите ОК.
Перейдем непосредственно к выгрузке дробных чисел.
Правильное отображение дробных чисел при выгрузке в CSV
Данный способ заключается в том, что мы просто заменяем точку на запятую используя встроенную функцию replace. Можно, кстати, сразу использовать ее без написания дополнительной функции, но как мне кажется, каждый раз прописывать весь синтаксис данной функции очень нудно, например:
SELECT col1, replace(col1::text, '.', ',') FROM test.table
где col1 – это столбец, содержащий дробное число.
И результат будет, например, таким:
col1 replace
10.5 10,5
Для удобства я предлагаю написать функцию, и в качестве параметра просто передавать число, а результат возвращать в виде текста, например:
--Название функции, test - это схема в БД CREATE OR REPLACE FUNCTION test.f_decimal(numeric) --Тип возвращаемого результата, т.е. текст RETURNS text AS $BODY$ DECLARE --Объявляем переменные _var alias for $1; _rez text; BEGIN --Просто заменяем точку на запятую SELECT into _rez replace(_var::text, '.', ','); --Возвращаем результат return _rez; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER FUNCTION test.f_decimal(numeric) OWNER TO "postgres";
Запрос в данном случае будет выглядеть следующим образом:
SELECT col1, test.f_decimal(col1) FROM test.table
И теперь те поля, в которых есть такие числа, необходимо пропускать через эту функцию и все, выгрузка будет осуществляться корректно.
Вот такой простенький пример, который может пригодиться Вам. Пока!