Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016

Тип с динамическим количеством символов после запятой

29.09.2023, 09:00. Показов 2125. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть такой код
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
DROP FUNCTION IF EXISTS test.myFunction1(INTEGER);
 
CREATE FUNCTION test.myFunction1("@numberOfSimbolsAfterComma") DEFAULT 2)
RETURNS TABLE ("value" NUMERIC(8,2))
LANGUAGE plpgsql AS $$
DECLARE
    "v_sql" text;
BEGIN
    DROP TABLE IF EXISTS tempMyTable1;
    CREATE TEMPORARY TABLE tempMyTable1 ("value" NUMERIC(8,2));
 
    INSERT INTO tempMyTable1 VALUES (1.11), (2.22), (3.33);
 
    "v_sql" = '
    ALTER TABLE tempMyTable1
    ALTER COLUMN "value" type numeric(8, '|| CAST((CASE WHEN "@numberOfSimbolsAfterComma" > = 0 THEN
        "@numberOfSimbolsAfterComma" ELSE 0 END) VARCHAR(2)) || ');';
    
    EXECUTE "v_sql";
 
    RETURN query
    SELECT t."value" FROM tempMyTable1 t;
 
    DROP TABLE tempMyTable1;
END;
$$;
 
SELECT * FROM test.myFunction1("@numberOfSimbolsAfterComma" => 1::INTEGER);

В параметре функции передается значение количества символов после запятой. В returns table задан тип со статическим количеством символов после запятой: numeric(8,2)).

Из-за такой статичности функция не работает так как надо. Скажите, возможно ли написать так, чтобы в returns table можно задать как тип с динамическим количеством символов после запятой? Или как то обойти?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.09.2023, 09:00
Ответы с готовыми решениями:

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

Тип double и количество символов после запятой
Здравствуйте, уважаемые я дико нуб, поэтому помогите чем можете ) суть такова: тип переменной double необходимо сделать так,...

В строке имеется одна точка с запятой. Подсчитать количество символов до точки с запятой и после неё
В строке имеется одна точка с запятой. Подсчитать количество символов до точки с запятой и после неё. Заранее большое спасибо!

11
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 808
29.09.2023, 10:15
Вы можете не указывать размерность для Numeric

SQL
1
RETURNS TABLE ("value" NUMERIC)
Так же обратите внимание что запись Numeric(8,2) означает что всего символов 8, два из которых отводится под дробную часть.

Поэтому запись Numeric(8,9) в принципе не допустима, а Numeric(8,8) позволит вводить числа только меньше 1
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
29.09.2023, 13:29  [ТС]
Цитата Сообщение от Swa111 Посмотреть сообщение
Вы можете не указывать размерность для Numeric

SQL
1
RETURNS TABLE ("value" NUMERIC)
Если написать так
SQL
1
SELECT * FROM test.myFunction1("@numberOfSimbolsAfterComma" => 3::INTEGER);
то возвращает не 3 символа после запятой, а 2.

Добавлено через 1 час 53 минуты
Цитата Сообщение от Swa111 Посмотреть сообщение
Так же обратите внимание что запись Numeric(8,2) означает что всего символов 8, два из которых отводится под дробную часть.

Поэтому запись Numeric(8,9) в принципе не допустима, а Numeric(8,8) позволит вводить числа только меньше 1
Можно написать так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--"@Количество символов после запятой" -- это входящий параметр
"@Количество символов до запятой" := 8; -- это константа
 
"@Количество символов после запятой" := (CASE
                        WHEN "Количество символов после запятой" > = 0 THEN
                             "Количество символов после запятой"
                    ELSE 0 END);
 
"@precision" := "@Количество символов до запятой" + "@Количество символов после запятой";
"@scale" = "@Количество символов после запятой";
 
"v_sql" = '
    ALTER TABLE tempMyTable1
    ALTER COLUMN "value" type numeric(' || CAST(@PRECISION AS VARCHAR(2)) || ', ' || CAST(@scale AS VARCHAR(2)) || ');';
Добавлено через 58 минут
Цитата Сообщение от MConst Посмотреть сообщение
то возвращает не 3 символа после запятой, а 2.
Тут можно написать правильнее с учетом данного фактора?
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 808
29.09.2023, 18:47
Кликните здесь для просмотра всего текста
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE SCHEMA IF NOT EXISTS test;
 
CREATE OR REPLACE FUNCTION test.myFunction1("@numberOfSimbolsAfterComma" INTEGER DEFAULT 2)
RETURNS TABLE ("value" NUMERIC)
LANGUAGE plpgsql AS $$
DECLARE
    "v_sql" text;
BEGIN
    DROP TABLE IF EXISTS tempMyTable1;
    CREATE TEMPORARY TABLE tempMyTable1 ("value" NUMERIC(8,2));
 
    INSERT INTO tempMyTable1 VALUES (1.11), (2.22), (3.33);
  
    "@numberOfSimbolsAfterComma" := GREATEST("@numberOfSimbolsAfterComma", 0);
 
    RETURN query EXECUTE
    'SELECT cast(t."value" as numeric(' || (8 + "@numberOfSimbolsAfterComma") || ', '|| "@numberOfSimbolsAfterComma" || ')) FROM tempMyTable1 t';
 
    DROP TABLE tempMyTable1;
END;
$$;
 
 
SELECT * FROM test.myFunction1("@numberOfSimbolsAfterComma" => 3::INTEGER);


тестировал тут, не много другой подход но число знаков после 0 меняется
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
09.10.2023, 12:43  [ТС]
В общем
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
DROP FUNCTION IF EXISTS test.myFunction1(INTEGER);
 
CREATE FUNCTION test.myFunction1("@numberOfSimbolsAfterComma") DEFAULT 2)
RETURNS TABLE ("value" NUMERIC(8,2))
LANGUAGE plpgsql AS $$
DECLARE
    "v_sql" text;
BEGIN
    DROP TABLE IF EXISTS tempMyTable1;
    CREATE TEMPORARY TABLE tempMyTable1 ("value" NUMERIC(8,2));
 
    INSERT INTO tempMyTable1 VALUES (1.11), (2.22), (3.33);
 
    "@numberOfSimbolsAfterComma" := greatest("@numberOfSimbolsAfterComma", 0);
 
    "v_sql" = '
    ALTER TABLE tempMyTable1
    ALTER COLUMN "value" type numeric('|| 8 + "@numberOfSimbolsAfterComma" ||  ', ' || "@numberOfSimbolsAfterComma" || ');';
    
    EXECUTE "v_sql";
 
    RETURN query
    SELECT t."value" FROM tempMyTable1 t;
 
    DROP TABLE tempMyTable1;
END;
$$;
 
SELECT * FROM test.myFunction1("@numberOfSimbolsAfterComma" => 3::INTEGER);

Возвращает не три символа после запятой, а два.

Аналогично, если так записать
SQL
1
2
RETURN query EXECUTE
'select cast(t."value" as numeric('|| 8 + "@numberOfSimbolsAfterComma" ||  ', ' || "@numberOfSimbolsAfterComma" || ')) from tempMyTable1 t;';
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 808
09.10.2023, 13:02
Так вместо
SQL
1
RETURNS TABLE ("value" NUMERIC(8,2))
Должно быть
SQL
1
RETURNS TABLE ("value" NUMERIC)
м.б у Вас среда так округляет? Попробуйте в текст перегнать
SQL
1
SELECT CAST(VALUE AS text) FROM test.myFunction1("@numberOfSimbolsAfterComma" => 10::INTEGER);
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
09.10.2023, 14:11  [ТС]
Цитата Сообщение от Swa111 Посмотреть сообщение
Так вместо
SQL
1
RETURNS TABLE ("value" NUMERIC(8,2))
Должно быть
SQL
1
RETURNS TABLE ("value" NUMERIC)
Также

м.б у Вас среда так округляет?
Как это можно точно определить?

Попробуйте в текст перегнать
SQL
1
SELECT CAST(VALUE AS text) FROM test.myFunction1("@numberOfSimbolsAfterComma" => 10::INTEGER);
Через текст то работает.
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 808
09.10.2023, 14:30
Если через текст работает, то где то дальше идет округление, а функция возвращает с заданной точностью
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
09.10.2023, 15:20  [ТС]
Получается от округления тут не избавиться.
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 808
09.10.2023, 16:04
возможно у вас где то дальше переменные не подходящего тепи или же в среде откидываются незначащие нули. а в чем сакральный смысл сохранять такую точность?
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
09.10.2023, 16:21  [ТС]
Осуществляются сверки между разными мерами, поэтому актуально задать точность типа эпсилона (в данном случае количество знаков после запятой). А также и соответствующее удобное результирующее отображение знаков после запятой.
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
11.10.2023, 13:55  [ТС]
В общем, это усечение зависит от источника данных.

Если бы написали так
SQL
1
2
3
4
CREATE TEMPORARY TABLE tempMyTable1 ("value" NUMERIC(8,2));
INSERT INTO tempMyTable1 VALUES (1.111), (2.22), (3.33);
...
SELECT * FROM test.myFunction1("@numberOfSimbolsAfterComma" => 3::INTEGER);
или
SQL
1
2
3
4
CREATE TEMPORARY TABLE tempMyTable1 ("value" NUMERIC(8,3));
INSERT INTO tempMyTable1 VALUES (1.11), (2.22), (3.33);
...
SELECT * FROM test.myFunction1("@numberOfSimbolsAfterComma" => 3::INTEGER);
то усекается тысячный знак

А если так
SQL
1
2
3
4
CREATE TEMPORARY TABLE tempMyTable1 ("value" NUMERIC(8,3));
INSERT INTO tempMyTable1 VALUES (1.111), (2.22), (3.33);
...
SELECT * FROM test.myFunction1("@numberOfSimbolsAfterComma" => 3::INTEGER);
то усечение тясячного знака не будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2023, 13:55
Помогаю со студенческими работами здесь

В строке имеется одна точка с запятой (;). Подсчитать количество символов до точки с запятой и после нее.
В строке имеется одна точка с запятой ( ; ). Подсчитать количество символов до точки с запятой и после нее.

Вывод в консоль с определённым количеством знаков после запятой
Создал программу нужно сделать количество знаков после запятой 3 или 4 консольное приложение type TСircle = class x , y , x1 ,...

Вывод числа с заданным количеством знаков после запятой
Программа сама работает, но я не могу фиксировать количество знаков после запятой setprecision() не работает Дан текстовый файл...

Назначить переменную с определенным количеством чисел после запятой
Добрый день. Подскажите пожалуйста как назначить переменную с определенным количеством чисел после запятой и единицей в конце. Пример:...

Вывод числа с ограниченным количеством знаков после запятой
float m; m = (6.0221412927*pow(10,23.0))/23; cout <<"Количество атомов в 1 мг Натрия = "<<m<<endl<<endl; Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru