powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сократить формулу
11 сообщений из 11, страница 1 из 1
Сократить формулу
    #34488709
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Я в PostgreSQL не силен, потому простой вопрос...

Есть команда
update main_tab set massa = round( cast(massa + 0.6 * cast( cast(size as text) as numeric)/1000 as numeric), 1 )

massa float4
size varchar20

Можно ли как то сократить формулу?
Мне кажется, что я лишнего нагородил с cast-ами...
...
Рейтинг: 0 / 0
Сократить формулу
    #34489207
v0v4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на самом деле можно сделать всего лишь на 1 меньше. Но можно записать компактнее.

massa = round(( massa + (0.7 * size::numeric) /1000)::numeric, 1);
...
Рейтинг: 0 / 0
Сократить формулу
    #34489234
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
update main_tab set massa = round( massa + 0.6 * size::real/1000 );
...
Рейтинг: 0 / 0
Сократить формулу
    #34489485
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запустил для поверки
select massa, round(( massa + (0.7 * size::numeric) /1000)::numeric, 1) from main_tab

ERROR: cannot cast type character varying to numeric
SQL state: 42846

select massa, round(( massa + (0.7 * size::text::numeric) /1000)::numeric, 1) from main_tab where pgroup = 'Б0753'
Вот так работает, только это тоже самое - вид сбоку :)

select massa, round( massa + 0.6 * size::real/1000,1 ) from main_tab

ERROR: cannot cast type character varying to real
SQL state: 42846

А вот так
select massa, round( massa + 0.6 * size::text::real/1000,1 ) from main_tab

ERROR: function round(double precision, integer) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You may need to add explicit type casts.

Мда...
Че то я в сильной задумчивости...
...
Рейтинг: 0 / 0
Сократить формулу
    #34489648
v0v4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как у тебя обьявлен size?
...
Рейтинг: 0 / 0
Сократить формулу
    #34489693
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
varchar(20)
Я в первом посте написал
...
Рейтинг: 0 / 0
Сократить формулу
    #34489767
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmGrsize::real

ERROR: cannot cast type character varying to real
SQL state: 42846Какая версия постгреса? У меня на 8.1 работает.

DmGrМда...
Че то я в сильной задумчивости...попробуйте так
select massa, round( (massa + 0.6 * size::text::real/1000)::numeric, 1 ) from main_tab
...
Рейтинг: 0 / 0
Сократить формулу
    #34489864
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так я уже писал...
select massa, round(( massa + (0.7 * size::text::numeric) /1000)::numeric, 1) from main_tab where pgroup = 'Б0753'
Вот так работает, только это тоже самое - вид сбоку :)

select massa, round( (massa + 0.6 * size::text::real/1000)::numeric, 1 ) from main_tab

Версия 7.4.2 забыл написать, пардон.

Собственно непонятно почему нельзя сразу из varchar в numeric
И непонятно, почему round нужен аргумент double?
...
Рейтинг: 0 / 0
Сократить формулу
    #34490070
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmGr Собственно непонятно почему нельзя сразу из varchar в numeric
И непонятно, почему round нужен аргумент double?
round(dp or numeric) (same as input) round to nearest integer round(42.4) 42 round(v numeric; s int) numeric round to s decimal places round(42.4382; 2) 42.44

можно вообще только кастом:
select (3.1415::float8 + 0.6 * '13.187'::float8/1000)::numeric(19,1)
...
Рейтинг: 0 / 0
Сократить формулу
    #34490109
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmGrВерсия 7.4.2 забыл написать, пардон.

Собственно непонятно почему нельзя сразу из varchar в numericСмотрите \dC в psql. На версии 8.1 можно:
Код: plaintext
1.
2.
3.
                                          List of casts
         Source type         |         Target type         |      Function       |   Implicit?
-----------------------------+-----------------------------+---------------------+---------------
 character varying           | numeric                     | numeric             | no

DmGrИ непонятно, почему round нужен аргумент double?Смотрите \df round. Видно, что есть три разных функции.
Код: plaintext
1.
2.
3.
4.
5.
                      List of functions
   Schema   | Name  | Result data type | Argument data types
------------+-------+------------------+---------------------
 pg_catalog | round | double precision | double precision
 pg_catalog | round | numeric          | numeric
 pg_catalog | round | numeric          | numeric, integer
...
Рейтинг: 0 / 0
Сократить формулу
    #34490186
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОК.

Спасибо. Все понятно.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сократить формулу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]