@Yaros75

Косяк при преобразовании текста в число, Почему теряются разряды?

В таблице есть столбец с идентификаторами вида YYMM.DD№№

2101.1601#
2101.1602#
2101.1701#
т.е. это дата плюс двузначное число. Мне нужно создать новый идентификатор на определённую дату.

Регуляркой выбираю последние 3 цифры из идентификаторов за опред дату напр 16.01.2021

SELECT REGEXP_MATCHES(номСделки, '\d\d\d(?=\D*$)', 'g')
FROM db.Сделки
WHERE номСделки ~ '2101\.16';
получаю набор: ( кстати что значат эти фиг скобки при выводе? )

{601}
{602}
теперь мне нужно изменит их тип на integer.

Пробовал to_number( val, '999' ); Почему то возвращает 60 вместо 601 куда-то девается один разряд.

Если пишу вручную to_number( '601', '999' ); результат правильный,

Если пишу вручную со скобками как в рез выборки to_number( '{601}', '999' );

то опять получаю такой же косяк 60 вместо 601. В чём дело?

Вот функция

CREATE OR REPLACE FUNCTION db.extract_nom(integer)
RETURNS text
LANGUAGE plpgsql
AS $function$
DECLARE
id_Сделки ALIAS FOR $1;
output integer;
reg text;
row_data text;
BEGIN

SELECT to_char( датаЗаявки, 'YYMM\.DD') INTO reg FROM db.Сделки WHERE id=id_Сделки;

--Перебор результатов запроса.
FOR row_data IN SELECT REGEXP_MATCHES(номСделки, '\d\d\d(?=\D*$)', 'g') FROM "db"."Сделки"
WHERE "номСделки" ~ reg ORDER BY "номСделки" DESC LOOP

output := to_number(row_data[1], '000');
END LOOP;

RETURN output;
END;
$function$
  • Вопрос задан
  • 37 просмотров
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Фигурные скобки означают массивы.
Если пишу вручную со скобками как в рез выборки to_number( '{601}', '999' );

Тут же должно быть всё очевидно, у вас сравнение проходит над:
{60
999
как итог: 60

Если уж тестировать, то так
SELECT to_number( (ARRAY['601'])[1], '999' );
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы