0

10gに取り組んでいます。

レコードの数値を返す正規表現がありますが、場合によっては 68.70125195853.50 のように複数の小数点を返します

私が必要としているのは、68.70 のように、小数点以下 2 桁のみを返す方法です。

to_char、to_number、round などの組み込み関数を試しました。

大変お世話になりました。

4

4 に答える 4

1

これは、最初の小数点以下 2 桁だけが必要な場合に機能します。サンプル データがないと、答えがずれている可能性があることに注意してください。もしそうなら、あなたが問題を抱えている値のいくつかの例を提供してください:

SELECT CAST(REGEXP_SUBSTR(myVal, '(\d+\.\d{0,2})|(\d+)') AS NUMBER(20, 2))
FROM myTable
WHERE REGEXP_LIKE(myVal, '(\d+\.\d{0,2})|(\d+)')

正規表現は、小数点以下 1 桁または 2 桁だけでなく、小数点以下の桁数でも動作するはずです。小数第 2 位以降は切り捨てられるため、丸めは行われないことに注意してください。丸めが必要な場合は、 を に変更する\d{0,2}\d+CASTが丸めを処理します。

このWHERE句は、数値を含まない列を無視するため、キャスト エラーが防止されます。


補遺: ここに正規表現の説明があります。2 つのパターンのいずれかを探します。

最初のパターンは(\d+\.\d{0,2}). これは、小数点以下の桁数キャッチします。

  • (==> 最初のパターンを区切り、最初のパターンの始まりを定義します
  • \d+==> 1 つ以上の数字に一致 ( \d「任意の数字」を意味します)
  • \.==> ピリオドに一致します (ピリオドは「特殊な」文字であるため、文字どおりに一致させるには、スラッシュ ( ) でエスケープする必要があります\)
  • \d{0,2}==> ゼロ、1、2 桁に一致
  • )==> 最初のパターンを区切り、最初のパターンの終わりを定義します

2つ目のパターンは(\d+). 小数点以下のない数字をキャッチします。

  • (==> 2 番目のパターンの開始を定義します
  • \d+==> 1 つ以上の数字に一致
  • )==> 2 番目のパターンの終わりを定義します

最後に、2 つのパターンがOR演算子 ( |) で結合されるため、いずれかのパターンが一致する場合に一致が得られます。

  • (最初のパターン)|(2 番目のパターン)

ここではパターンの順序が重要です。「小数を含む数」は「小数を含まない数」パターンにも一致するからです。そのため、「小数点以下の数字」パターンが最初です。

于 2013-08-08T15:50:24.737 に答える
0

1 つの方法を次に示します。

select (case when val like '%.%'
             then cast(substr(t.val, 1, instr(val, '.')+2) as float)
             else cast(val as float)
        end)
from (select '68.70125195853.50' as val from dual) t;

ステートメントは、case少なくとも 1 つの小数点をチェックしています。

于 2013-08-08T15:44:40.980 に答える
0

試す:

 CAST(value AS Decimal(15,2))

数字の「見た目」だけに関心がある場合は、次を使用できます。

SELECT TO_CHAR(num, '999,999,990.00')
  FROM MyTable
于 2013-08-08T15:40:52.463 に答える