找到不受限制的数字类型的比例的最聪明方法是什么?

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)

a_h*_*ame 5

有没有更优雅的方法来做到这一点

是的,使用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