【问题标题】:Remove point in numbers of 4 or more digits?删除 4 位或更多位数字中的点?
【发布时间】:2020-02-12 05:46:23
【问题描述】:

我使用的是 PostgreSQL 9,并且我有一个列类型为 numeric 的表。 数据库中的数据是这样保存的:

id | limit 
23 | 1.485
24 | 35.601

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

  • 1.485 → 1485
  • 35.601 → 35601

我该怎么做?

【问题讨论】:

  • Postgres 9.1 是 no longer supported 你应该尽快计划升级(例如到 Postgres 11 或 12)
  • 我认为我们需要一点解释。应该如何处理少于 4 位的数字(例如 1.99)?数字 1.99 是否应该保持不变,但 1.001 会增加到 1001?对我来说看起来很奇怪

标签: sql postgresql postgresql-9.1


【解决方案1】:

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

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

【讨论】:

  • 这将更新所有个数字,而不仅仅是那些有 4 个或更多数字的数字
  • @Nick 你介意详细说明一下吗?欣赏一个示例测试用例
【解决方案2】:

您可以按照@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.001会增加到1001但是1.01不会变?
  • @SlavaRozhnev 我同意 - 这似乎是一件奇怪的事情。但这是 OP 要求的......
【解决方案3】:

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

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

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

【讨论】:

  • 您的查询似乎不正确。它舍入数字而不是增加它们。 SELECT to_char(35.601, '99999999') FROM atable; -- > return 36
  • 对。我相信这个数字真的是1485,而客户端只是添加了“分组”字符。但也许点真的是小数分隔符,那么我的回答是错误的。到目前为止,OP还没有给出反馈。
【解决方案4】:

问题看起来是由于将格式化的字符串插入到数字字段中。 例如格式化数字“1.234”(一千二百三十四)插入为 1.234(整数和千分之二百三十四)

如果我的建议正确,则可以通过乘以 1000 来解决问题,但整数除外(它们是存储的权利)。

所以接下来是解决方案:

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

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2022-01-23
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多