用4位或更多数字表示的点?

问题描述 投票:0回答:4

我正在使用PostgreSQL 9,并且我有一个列类型为numeric的表。数据库中的数据按以下方式保存:

id | limit 
23 | 1.485
24 | 35.601

在此示例中,我需要将表中的limit值替换为整数值:

  • 1.485→1485
  • 35.601→35601

我该怎么做?

sql postgresql postgresql-9.1
4个回答
2
投票

[等待其他答案的同时尝试以下更新语句,

update your_table_name
set limit = cast(replace(cast(limit as text),'.','') as numeric)

1
投票

您可以按照@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

Demo on SQLFiddle


1
投票

如果数据类型确实为numeric,则其中没有存储点。当将数字转换为字符串时,这些分组分隔符必须是您的客户端软件的产物。

您可以使用to_char自己将数字转换为字符串并挫败客户端软件的误导性手段:

SELECT to_char(numcol, '99999999') FROM atable;

0
投票

该问题看起来是由于将格式化的字符串插入数字字段而导致的。例如,插入为1.234(一整二百三十四分之一)的格式化数字'1.234'(一千二百三十四)]

如果我的建议权是问题,可以将其乘以1000来解决,整数除外(它们是存储权)。

所以解决方法是下一个:

UPDATE table set limit = round(limit * 1000) where limit != round(limit);
© www.soinside.com 2019 - 2024. All rights reserved.