10gに取り組んでいます。
レコードの数値を返す正規表現がありますが、場合によっては 68.70125195853.50 のように複数の小数点を返します
私が必要としているのは、68.70 のように、小数点以下 2 桁のみを返す方法です。
to_char、to_number、round などの組み込み関数を試しました。
大変お世話になりました。
これは、最初の小数点以下 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 番目のパターン)
ここではパターンの順序が重要です。「小数を含む数」は「小数を含まない数」パターンにも一致するからです。そのため、「小数点以下の数字」パターンが最初です。
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 つの小数点をチェックしています。
試す:
CAST(value AS Decimal(15,2))
数字の「見た目」だけに関心がある場合は、次を使用できます。
SELECT TO_CHAR(num, '999,999,990.00')
FROM MyTable