и Postgres функция возвращает целочисленное значение, а не числовое
Эта функция postgres должна возвращать десятичное число, но вместо этого результатом является целое число. SQL сам по себе работает правильно. Что не так со структурой функций? Пример входных данных является степенью минута секунда долготы в тексте - '1012104.00 Е'
CREATE OR REPLACE FUNCTION getSEC(inORD VARCHAR)
RETURNS NUMERIC(10) AS $$
DECLARE
sec NUMERIC(10);
BEGIN
sec := cast(right(substring(inOrd,0,length(inOrd)-3,2)as numeric(10))/3600;
RETURN sec;
END; $$
LANGUAGE plpgsql;
Заранее благодарю.
2 ответов:
numericпринимает как "точность", так и "масштаб". Точность - это общее количество цифр. Масштаб - это то, сколько из них может быть справа от десятичной дроби. документы Postgres предоставляют пример .Точность числа - это общее количество значащих цифр во всем числе, то есть количество цифр по обе стороны десятичной запятой. Масштаб числа - это количество десятичных разрядов в дробной части, справа от десятичной точки. Так что ... число 23.5141 имеет точность 6 и шкалу 4. Целые числа можно считать имеющими нулевую шкалу.Если вы не указываете масштаб, он по умолчанию равен 0, что означает, что вы получаете целое число. Таким образом,
numeric(10)- это целое число с максимальным числом 10 цифр. Документы Postgres находят эту "особенность" стандарта SQL особенно бесполезной.(стандарт SQL требует шкалы по умолчанию 0, то есть принуждения к целочисленной точности. Мы находим это немного бесполезным. Если вы беспокоитесь о переносимость, всегда указывайте точность и масштаб явно.)
Если вы хотите
1012104.00, вам понадобитсяnumeric(9, 2). 9 цифр, 2 из которых находятся справа от десятичной.
Numeric (10) является целым числом - если вы посмотрите на документы, он принимает второй параметр (масштаб), который влияет на количество десятичных знаков, и по умолчанию равен 0.
Https://www.postgresql.org/docs/current/static/datatype-numeric.html
Вместо этого можно привести к десятичной системе счисления:
CREATE OR REPLACE FUNCTION getSEC(inORD VARCHAR) RETURNS NUMERIC(10) AS $$ DECLARE sec NUMERIC(10); BEGIN sec := cast(right(substring(inOrd,0,length(inOrd)-3,2)as numeric(10))/3600; RETURN sec; END; $$ LANGUAGE plpgsql;
Comments