概要
TRUNCATE は、numeric-expr を小数点から scale 桁目で切り捨てます。数値の丸めやゼロの埋め込みはしません。TRUNCATE 処理の前に、先頭と末尾のゼロは削除されます。
-
scale が正の数である場合、切り捨ては小数点から右に数えたその桁数で実行されます。scale が小数桁数以上の数である場合、切り捨てやゼロの埋め込みは実行されません。
-
scale が 0 の場合、数値は整数に切り捨てられます。つまり、切り捨ては小数点右側の 0 桁目で実行され、小数点以下と小数点そのものが切り捨てられます。
-
scale が負の数である場合、切り捨ては小数点から左に数えたその桁数で実行されます。scale が数の整数桁数以上である場合は、ゼロが返されます。
-
numeric-expr がゼロ (ただし 00.00 や -0 などのように表されている) 場合、TRUNCATE は scale の値とは無関係に小数桁のない 0 (ゼロ) を返します。
-
numeric-expr または scale が NULL の場合、TRUNCATE は NULL を返します。
TRUNCATE は { } 括弧構文による ODBC スカラ関数としてのみ使用できます。
ROUND を使用して、数値で同様のトランケーション処理を実行できます。TRIM を使用して、文字列で同様のトランケーション処理を実行できます。
TRUNCATE、ROUND、および $JUSTIFY
数値関数 TRUNCATE と ROUND の動作は似ています。両方とも小数桁または整数桁の有効桁数を減らすために使用できます。ROUND では、丸め (既定) または切り捨てを指定できます。TRUNCATE は丸めを行いません。ROUND は numeric-expr と同じデータ型を返します。TRUNCATE は numeric-expr をデータ型 NUMERIC として返します。ただしこれは、numeric-expr がデータ型 DOUBLE でない場合に限ります。DOUBLE である場合は、データ型 DOUBLE を返します。
TRUNCATE では、指定された小数桁数への切り捨てを行います。切り捨てによって末尾にゼロが生じた場合、これらの末尾のゼロは保持されます。ただし、scale が numeric-expr のキャノニック形式の小数桁数より大きい場合、TRUNCATE はゼロパディングを行いません。
ROUND では、指定された小数桁数への丸め (または切り捨て) を行いますが、その戻り値は常に正規化され、末尾のゼロが削除されます。例えば、ROUND(10.004,2) は 10.00 ではなく 10 を返します。
固定の小数桁数への丸めが重要な場合、例えば金額を表す場合などは、$JUSTIFY を使用します。$JUSTIFY は、丸め処理の後に指定された数の末尾のゼロを返します。丸める桁数が小数桁数より大きい場合、$JUSTIFY はゼロパディングを行います。また $JUSTIFY では、DecimalSeparator 文字が数値列内で揃うように数値が右寄せされます。$JUSTIFY は切り捨てを行いません。
例
次の 2 つの例では、数値を小数第 2 位で切り捨てます。最初は (ダイナミック SQL を使用して) 整数として scale を指定し、2 番目は (埋め込み SQL を使用して) 整数に変換するホスト変数として scale を指定しています。
SET myquery = "SELECT {fn TRUNCATE(654.321888,2)} AS trunc"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
SET x=2
&sql(SELECT {fn TRUNCATE(654.321888,:x)}
INTO :a)
IF SQLCODE'=0 {
WRITE !,"Error code ",SQLCODE }
ELSE {
WRITE !,"truncated value is: ",a }
両方の例とも、654.32 を返します (小数第 2 位で切り捨て)。
以下ダイナミック SQL の例は、小数桁数より大きな scale を指定しています。
SET myquery = "SELECT {fn TRUNCATE(654.321000,9)} AS trunc"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
この場合は 654.321 が返されます (InterSystems IRIS が切り捨て処理を行う前に末尾のゼロを削除し、切り捨てもゼロの埋め込みも行われません)。
次のダイナミック SQL の例では、0 の scale を指定しています。
SET myquery = "SELECT {fn TRUNCATE(654.321888,0)} AS trunc"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
これは 654 を返します (小数点以下すべてと小数点が切り捨てられます)。
次のダイナミック SQL の例では、負の scale を指定しています。
SET myquery = "SELECT {fn TRUNCATE(654.321888,-2)} AS trunc"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
これは 600 を返します (整数桁が 2 桁切り捨てられ、0 で置き換わります。丸めは実行されません)。
次のダイナミック SQL の例では、負の scale を数値の整数桁数と同じに指定しています。
SET myquery = "SELECT {fn TRUNCATE(654.321888,-3)} AS trunc"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
これは 0 を返します。