3

小数の価格のリストがあります。

例: 0.513 0.35135 1.6583

10 進数の長さを選択しようとしています。これが私が言いたいことです: 0.513 | 長さ=3 0.35135 | 長さ=5 1.6583 | 長さ=4

数値をテキストに変換しようとしましたが、正しい結果が得られないようです: select price, length(cast(price as text)) from table.prices

この変換方法も試しました:「長さ(価格::テキスト)」

これを達成する方法についてアドバイスはありますか?

4

5 に答える 5

3

これはどう:

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 │
└────────────────┘
于 2013-11-11T16:39:06.657 に答える
1

このコードは動作します ( SQLFiddle Demoを参照):

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

落とし穴は 1 つだけです。それは整数全体を返します-1

于 2013-11-11T10:27:35.847 に答える
0

このための sql または plpgsql 関数を記述します。(または、アプリでこれを行うことをお勧めします。そもそも Postgres に属していない可能性があります。)

必要な疑似コードは次のとおりです。

  1. 数値をテキストにキャストします。
  2. ドット位置を見つけます。ない場合はゼロを返し、そうでない場合はそれに応じて長さを計算します。

指数を持つものを扱っている場合は、最初に値を数値にキャストして、たとえば1e-12に展開するようにして0.000000000001ください。

于 2013-11-11T11:38:22.147 に答える