Sample Header Ad - 728x90

What's the smartest way to find the scale of an unrestricted numeric type?

3 votes
1 answer
753 views
By laziness and convenience I integrated quite a lot of data from a partner in an unrestricted *numeric* type in my PostgreSQL database. However it now seems that depending of different shipments from this partner the scale of the *numeric* varies from zero to over 20 decimal places (or scale) which don't make a lot of sense and probably consume quite a lot of storage for no good reason. So I would like to restrict my *numeric* field to a reasonable scale. However because my partner don't provide any recommendations I would like to identify the occurrence of each scale in my data-set to potentially identify a reasonable middle ground between 0 and 20 (zero obviously not being an option and given the 17 Million row-count, aggregated sums ARE going to be impacted by my decision). It will also be needed during following rounding to avoid actually increase the scale of values that were shipped with a scale of zero. ---------- Long story short, what the nicest way to compute that for a specific number stored as an arbitrary *numeric*? Best I could come up to is that, but is there a more elegant way to do that without converting to text?
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)
Asked by MarHoff (253 rep)
Jul 4, 2019, 10:40 AM
Last activity: Jul 4, 2019, 12:34 PM