フォーマットとパースのための数値パターン
説明
to_number
および to_char
などの関数は、文字列と Decimal 型の値間の変換をサポートしています。これらの関数は、これらの型間のマッピング方法を示すフォーマット文字列を受け入れます。
構文
数値フォーマット文字列は次の構文をサポートします。
{ ' [ MI | S ] [ $ ]
[ 0 | 9 | G | , ] [...]
[ . | D ]
[ 0 | 9 ] [...]
[ $ ] [ PR | MI | S ] ' }
要素
各数値フォーマット文字列には、次の要素を含めることができます(大文字と小文字は区別されません)。
-
0
または9
0
から9
の間の期待される数字を指定します。フォーマット文字列内の 0 または 9 のシーケンスは、同じサイズ以下の数字のシーケンスと一致します。0/9 シーケンスが 0 で始まり、小数点の前にある場合、桁数を正確に一致させる必要があります。パース時、同じサイズの数字のシーケンスのみに一致します。フォーマット時、結果の文字列には、同じサイズに達するまで数字のシーケンスに左側にゼロパディングが追加されます。それ以外の場合、0/9 シーケンスは、パース時に同じサイズ以下の任意の数字のシーケンスと一致します。フォーマット時には、結果の文字列に数字のシーケンスにスペース(小数点の前にある場合)またはゼロ(小数点の後にがある場合)のパディングを追加します。サイズが 0/9 シーケンスよりも大きい場合、数字のシーケンスはフォーマット時に「#」シーケンスになります。
-
.
またはD
小数点の位置を指定します。この文字は一度だけ指定できます。
パース時、入力文字列に小数点を含める必要はありません。
-
,
またはG
,
グループ化(千)セパレータの位置を指定します。各グループ化セパレータの左右には、
0
または9
が存在する必要があります。パース時、入力文字列は数値のサイズに関連するグループ化セパレータと一致する必要があります。 -
$
$
通貨記号の位置を指定します。この文字は一度だけ指定できます。 -
S
オプションの「+」または「-」記号の位置を指定します。この文字は一度だけ指定できます。
-
MI
オプションの「-」記号(「+」なし)の位置を指定します。この文字は一度だけ指定できます。
フォーマット時、正の値にはスペースを出力します。
-
PR
負の入力値を対応する文字列で角括弧で囲みます(
<1>
)。正の入力値は角括弧で囲まれません。
関数型とエラー処理
to_number
関数は、入力文字列とフォーマット文字列引数を受け入れます。入力文字列が指定されたフォーマットに一致することが必要であり、そうでない場合はエラーが発生します。その後、関数は対応する Decimal 値を返します。try_to_number
関数は、入力文字列とフォーマット文字列引数を受け入れます。入力文字列が指定された数値フォーマットと一致しない場合にエラーを発生させる代わりに NULL を返す点を除いて、to_number
関数と同じように動作します。to_char
関数は、入力 decimal とフォーマット文字列引数を受け入れます。その後、関数は対応する文字列値を返します。- 指定されたフォーマット文字列が無効な場合、すべての関数は失敗します。
例
次の例では、to_number
、try_to_number
、および to_char
SQL 関数を使用しています。
これらの例のほとんどで使用されているフォーマット文字列は、次のことを期待していることに注意してください。
- 先頭にオプションの符号、
- それに続くドル記号、
- それに続く3桁から6桁の数値、
- 千のセパレータ、
- 小数点以下最大2桁。
to_number
関数
-- The negative number with currency symbol maps to characters in the format string.
> SELECT to_number('-$12,345.67', 'S$999,099.99');
-12345.67
-- The '$' sign is not optional.
> SELECT to_number('5', '$9');
Error: the input string does not match the given number format
-- The plus sign is optional, and so are fractional digits.
> SELECT to_number('$345', 'S$999,099.99');
345.00
-- The format requires at least three digits.
> SELECT to_number('$45', 'S$999,099.99');
Error: the input string does not match the given number format
-- The format requires at least three digits.
> SELECT to_number('$045', 'S$999,099.99');
45.00
-- MI indicates an optional minus sign at the beginning or end of the input string.
> SELECT to_number('1234-', '999999MI');
-1234
-- PR indicates optional wrapping angel brakets.
> SELECT to_number('9', '999PR')
9
try_to_number
関数
-- The '$' sign is not optional.
> SELECT try_to_number('5', '$9');
NULL
-- The format requires at least three digits.
> SELECT try_to_number('$45', 'S$999,099.99');
NULL
to_char
関数
> SELECT to_char(decimal(454), '999');
"454"
-- '99' can format digit sequence with a smaller size.
> SELECT to_char(decimal(1), '99.9');
" 1.0"
-- '000' left-pads 0 for digit sequence with a smaller size.
> SELECT to_char(decimal(45.1), '000.00');
"045.10"
> SELECT to_char(decimal(12454), '99,999');
"12,454"
-- digit sequence with a larger size leads to '#' sequence.
> SELECT to_char(decimal(78.12), '$9.99');
"$#.##"
-- 'S' can be at the end.
> SELECT to_char(decimal(-12454.8), '99,999.9S');
"12,454.8-"
> SELECT to_char(decimal(12454.8), 'L99,999.9');
Error: cannot resolve 'to_char(Decimal(12454.8), 'L99,999.9')' due to data type mismatch:
Unexpected character 'L' found in the format string 'L99,999.9'; the structure of the format
string must match: [MI|S] [$] [0|9|G|,]* [.|D] [0|9]* [$] [PR|MI|S]; line 1 pos 25