PostgreSQL - 选择数字/小数的长度

时间:2013-11-11 10:15:42

标签: sql postgresql

我有一个带小数的价格清单。

实施例: 0.513 0.35135 1.6583

我试图选择十进制数字的长度。 这就是我的意思:     0.513 |长度= 3     0.35135 |长度= 5     1.6583 |长度= 4

我尝试将数字转换为文字,但它似乎没有提供正确的结果:     select price, length(cast(price as text)) from table.prices

我也试过这种转换方法:     "长度(价格::文本)"

关于如何实现这一目标的任何建议?

5 个答案:

答案 0 :(得分:4)

这个怎么样:

CREATE FUNCTION decimal_places(n numeric) RETURNS int
LANGUAGE SQL IMMUTABLE
AS $$
select coalesce(length(substring(cast($1 as text) from '\..*$')) - 1, 0);
$$;

=> select decimal_places(0.513);
┌────────────────┐
│ decimal_places │
├────────────────┤
│              3 │
└────────────────┘

答案 1 :(得分:1)

您可以使用scale函数,因为postgresql 9.6;)

select scale(1.12345) as decimal_places;
 decimal_places 
----------------
              5
(1 row)

答案 2 :(得分:0)

此代码有效(请参阅SQLFiddle Demo):

WITH test(x) AS (VALUES (0.513), (0.35135), (1.6583))
SELECT length((x - floor(x))::text)-2
FROM test

只有一个问题 - 对于整数整数,它返回-1

答案 3 :(得分:0)

为此编写一个sql或plpgsql函数。 (或者更好的是,在你的应用程序中执行此操作:它可能不属于Postgres。)

您需要的伪代码是:

  1. 将数字转换为文字。
  2. 找到点位置。如果不是,则返回零,否则相应地计算长度。
  3. 如果你正在处理具有指数的东西,请确保首先将值转换为数字,以便扩展例如1e-120.000000000001

答案 4 :(得分:0)

在select中可以这样使用:

SELECT length((SELECT regexp_matches(price::text,'(\\.\\d+)')::text)), price FROM table.prices