/*Query to find length of digits/decimals in a number*/
WITH tAS (SELECT 123.456 num
FROM dual
UNION ALL
SELECT 1234
FROM dual
UNION ALL
SELECT 0.12345
FROM dual)
SELECT num,
Length(To_char(Trunc(Abs(num)))) vscale,
Length(To_char(MOD(Abs(num), 1))) - 1 vprecision,
( Length(Trim(trailing '0' FROM ( num - Floor(num) ))) - 1 ) decimal_places
FROM t;
FROM t;
WITH s
AS (
-- sample data --
SELECT 1234 n
FROM dual
UNION ALL
SELECT 1234.123
FROM dual
UNION ALL
SELECT 0.123
FROM dual
-- sample data --
)
SELECT n,
Length(Floor(n))
+ Nvl(Length(Rtrim(Substr(cn, Instr(cn, '.')+1), '0')), 0) nb_digits,
Nvl(Length(Rtrim(Substr(cn, Instr(cn, '.') + 1), '0')), 0) nbr_decimal
FROM (SELECT n,
To_char(n, 'fm99999999999999999D99999999999999999',
'NLS_NUMERIC_CHARACTERS = ''. ''') cn
FROM s);
AS (
-- sample data --
SELECT 1234 n
FROM dual
UNION ALL
SELECT 1234.123
FROM dual
UNION ALL
SELECT 0.123
FROM dual
-- sample data --
)
SELECT n,
Length(Floor(n))
+ Nvl(Length(Rtrim(Substr(cn, Instr(cn, '.')+1), '0')), 0) nb_digits,
Nvl(Length(Rtrim(Substr(cn, Instr(cn, '.') + 1), '0')), 0) nbr_decimal
FROM (SELECT n,
To_char(n, 'fm99999999999999999D99999999999999999',
'NLS_NUMERIC_CHARACTERS = ''. ''') cn
FROM s);
No comments:
Post a Comment