フォーマットと解析のための数値パターン
説明
to_number や to_char などの関数は、文字列型と Decimal 型の値間の変換をサポートします。これらの関数は、これらの型間のマッピング方法を示すフォーマット文字列を受け取ります。
構文
数値フォーマット文字列は以下の構文をサポートしています。
{ ' [ MI | S ] [ $ ]
[ 0 | 9 | G | , ] [...]
[ . | D ]
[ 0 | 9 ] [...]
[ $ ] [ PR | MI | S ] ' }
要素
各数値フォーマット文字列には、以下の要素(大文字小文字を区別しない)を含めることができます。
-
0または90から9までの期待される桁を指定します。フォーマット文字列内の 0 または 9 のシーケンスは、同じかそれより小さいサイズの桁のシーケンスに一致します。0/9 シーケンスが 0 で始まり、小数点の前に来る場合、厳密な桁数の一致が必要です。解析時には、同じサイズの桁シーケンスのみに一致します。フォーマット時には、結果文字列は桁シーケンスにゼロを左詰めして、同じサイズになるようにします。それ以外の場合、0/9 シーケンスは、解析時には同じかそれより小さいサイズの任意の桁シーケンスに一致し、フォーマット時には結果文字列にスペース(小数点の前)またはゼロ(小数点の後)を桁シーケンスにパディングします。フォーマット時に、サイズが 0/9 シーケンスより大きい場合、桁シーケンスは '#' シーケンスになることに注意してください。
-
.またはD小数点の位置を指定します。この文字は一度だけ指定できます。
解析時、入力文字列に小数点が含まれている必要はありません。
-
,またはG,グルーピング(千単位)区切り文字の位置を指定します。各グルーピング区切り文字の左右には、
0または9が存在する必要があります。解析時、入力文字列は数値のサイズに関連するグルーピング区切り文字と一致する必要があります。 -
$$通貨記号の位置を指定します。この文字は一度だけ指定できます。 -
Sオプションの '+' または '-' 記号の位置を指定します。この文字は一度だけ指定できます。
-
MIオプションの '-' 記号の位置を指定します('+' はありません)。この文字は一度だけ指定できます。
フォーマット時、正の値にはスペースを出力します。
-
PR負の入力値を、対応する文字列内の山括弧(
<1>)にマッピングします。正の入力値には山括弧は適用されません。
関数タイプとエラー処理
to_number関数は、入力文字列とフォーマット文字列の引数を受け取ります。入力文字列が指定されたフォーマットと一致することを要求し、一致しない場合はエラーを発生させます。その後、関数は対応する Decimal 値を返します。try_to_number関数は、入力文字列とフォーマット文字列の引数を受け取ります。to_number関数と同じように動作しますが、入力文字列が指定された数値フォーマットと一致しない場合、エラーを発生させる代わりに NULL を返します。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 brackets.
> 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