Mar*_*off 3 postgresql decimal
由于懒惰和方便,我在我的 PostgreSQL 数据库中以不受限制的数字类型集成了来自合作伙伴的大量数据。
然而,现在看来,根据该合作伙伴的不同出货量,数字的比例从零到超过 20 个小数位(或比例)不等,这没有多大意义,可能会无缘无故地消耗大量存储空间. 所以我想将我的数字字段限制在一个合理的范围内。
然而,因为我的合作伙伴没有提供任何建议,我想确定我的数据集中每个尺度的出现,以可能在 0 和 20 之间确定一个合理的中间地带(零显然不是一个选项,并且考虑到 1700 万行-算,总金额将受到我的决定的影响)。
在接下来的四舍五入过程中也需要使用它,以避免实际增加标度为零的值的标度。
长话短说,对于存储为任意数字的特定数字,计算它的最佳方法是什么?
我能想到的最好的方法是,但有没有更优雅的方法可以在不转换为文本的情况下做到这一点?
SELECT
my_numeric,
COALESCE(
char_length( -- Finding size of string extracted by a...
substring(my_numeric::text,'\.(\d*)') -- regexp to return all digits right from '.'
), -- but if scale is 0 substring return NULL
0 -- so I handled this inside a COALESCE
) AS my_numeric_scale
FROM
(VALUES
(0.1::numeric),
(0.12),(0.123),
(0.1234),
(0.12345),
(0.123456),
(0.000001),
(0.100000)
) foo (my_numeric)
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方法来做到这一点
是的,使用scale()9.6 中引入的函数:
SELECT my_numeric,
scale(my_numeric)
FROM (
VALUES
(0.1::numeric),
(0.12),(0.123),
(0.1234),
(0.12345),
(0.123456),
(0.000001),
(0.100000)
) foo (my_numeric)
Run Code Online (Sandbox Code Playgroud)
在线示例:https : //rextester.com/MVJQR23795
| 归档时间: |
|
| 查看次数: |
42 次 |
| 最近记录: |