Удалить точку в количестве 4 или более цифр? - PullRequest
0 голосов
/ 12 февраля 2020

Я использую PostgreSQL 9, и у меня есть таблица с типом столбца numeric. Данные в базе данных сохраняются следующим образом:

id | limit 
23 | 1.485
24 | 35.601

Мне нужно заменить значения limit в таблице на целочисленные значения, в этом примере:

  • 1.485 → 1485
  • 35.601 → 35601

Как я могу это сделать?

Ответы [ 4 ]

2 голосов
/ 12 февраля 2020

Попробуйте следующий оператор обновления в ожидании других ответов,

update your_table_name
set limit = cast(replace(cast(limit as text),'.','') as numeric)
1 голос
/ 12 февраля 2020

Если тип данных действительно numeric, то в нем нет сохраненных точек. Эти разделители группировки должны быть артефактом вашего клиентского программного обеспечения при преобразовании чисел в строки.

Вы можете использовать to_char, чтобы самостоятельно преобразовать числа в строки и предотвратить ошибочные махинации вашего клиентского программного обеспечения:

SELECT to_char(numcol, '99999999') FROM atable;
1 голос
/ 12 февраля 2020

Вы можете обновить значения, как описывает @Vivek, но вам нужно квалифицировать обновление так, чтобы обновлялись только те числа с 4 или более цифрами, которые можно проверить с помощью SIMILAR TO:

UPDATE data
SET "limit" = CAST(REPLACE(CAST("limit" AS text), '.', '') AS numeric)
WHERE REPLACE(CAST("limit" AS text), '.', '') SIMILAR TO '[0-9]{4,}'

Для этого примера данных:

CREATE TABLE data
    (id int, "limit" numeric)
;

INSERT INTO data
    (id, "limit")
VALUES
    (23, 1.485),
    (24, 35.601),
    (25, 3.2),
    (26, 1.23),
    (27, 23.1)

Вывод:

id  limit
23  1485
24  35601
25  3.2
26  1.23
27  23.1

Демонстрация по SQLFiddle

0 голосов
/ 12 февраля 2020

Проблема выглядит как результат вставки отформатированных строк в поле цифр c. Например, отформатированное число «1.234» (одна тысяча двести тридцать четыре), вставленное как 1.234 (целое и двести тридцать четыре тысячи)

Если мое предложение верно, проблему можно исправить умножением на 1000, кроме целых номера (они сохранены право).

Итак, решение следующее:

UPDATE table set limit = round(limit * 1000) where limit != round(limit);
...