$JUSTIFY (SQL)
構文
$JUSTIFY(expression,width[,decimal])
概要
$JUSTIFY は、指定した width 内で expression で指定した値を右寄せして返します。width 内で小数点を揃えるために、decimal 引数を使用できます。
-
$JUSTIFY(expression,width):引数が 2 つの構文では、expression を width 内で右寄せします。expression の変換は実行されません。expression には、数値、または非数値文字列を使用できます。
-
$JUSTIFY(expression,width,decimal):引数が 3 つの構文では、expression をキャノニック形式の数値に変換し、decimal まで小数桁を丸めるかゼロで埋めてから、結果となる数値を width 内で右寄せします。expression が非数値文字列または NULL の場合、InterSystems IRIS はそれを 0 に変換し、パディングしてから、右寄せします。
$JUSTIFY は、現在のロケールのための DecimalSeparator 文字を認識します。必要に応じて DecimalSeparator 文字を追加または削除します。DecimalSeparator 文字はロケールによって異なります。一般に、米国形式のロケール用のピリオドかヨーロッパ形式のロケール用のコンマ (,) のどちらかとなります。ユーザのロケールの DecimalSeparator 文字を決定するには、以下のメソッドを呼び出します。
WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
指定する引数が少なすぎると、SQLCODE -380 が発行されます。指定する引数が多すぎると、SQLCODE -381 が発行されます。
$JUSTIFY、ROUND、および TRUNCATE
固定の小数桁数への丸めが重要な場合、例えば金額を表す場合などは、$JUSTIFY を使用します。これは、丸め処理の後に指定された数の末尾のゼロを返します。decimal が expression の小数桁数より大きい場合、$JUSTIFY はゼロパディングを行います。また $JUSTIFY では、DecimalSeparator 文字が数値列内で揃うように数値が右寄せされます。
また ROUND では、指定された小数桁数への丸めを行いますが、その戻り値は常に正規化され、末尾のゼロが削除されます。例えば、ROUND(10.004,2) は 10.00 ではなく 10 を返します。$JUSTIFY とは異なり、ROUND では、丸め (既定) または切り捨てを指定できます。
TRUNCATE では、指定された小数桁数への切り捨てを行います。ROUND とは異なり、切り捨てによって末尾にゼロが生じた場合、これらの末尾のゼロは保持されます。ただし、$JUSTIFY とは異なり、TRUNCATE はゼロパディングを行いません。
ROUND および TRUNCATE では、小数点記号の左に丸める (または切り捨てる) ことができます。例えば、ROUND(128.5,-1) は 130 を返します。
$JUSTIFY および LPAD
引数が 2 つの形式の LPADおよび引数が 2 つの形式の $JUSTIFY はどちらも、先頭にスペースを使用してパディングすることで文字列を右寄せします。引数が 2 つのこれらの形式の違いは、入力 expression の長さより短い出力 width の扱い方です。LPAD は、指定された出力長に合わせて入力文字列を切り捨てます。$JUSTIFY は、入力文字列に合わせて出力長を拡大します。詳細は、以下の例を参照してください。
SELECT '>'||LPAD(12345,10)||'<' AS lpadplus,
'>'||$JUSTIFY(12345,10)||'<' AS justifyplus,
'>'||LPAD(12345,3)||'<' AS lpadminus,
'>'||$JUSTIFY(12345,3)||'<' AS justifyminus
引数が 3 つの形式の LPAD では、スペース以外の文字での左パディングが可能です。
引数
expression
右寄せする値 (任意で、指定された小数桁数の数値として表します)。
-
文字列揃えが必要は場合は、decimal は指定しないでください。expression にはどの文字でも含めることができます。$JUSTIFY は、"width" で説明しているように expression を右寄せします。
-
数値揃えが必要は場合は、decimal を指定します。decimal が指定されている場合、InterSystems IRIS は expression を $JUSTIFY にキャノニック形式の数値として提供します。先頭のプラス符号とマイナス符号を解決し、先頭および末尾のゼロを削除します。最初の非数値文字列で expression を切り捨てます。expression の先頭が非数値文字列 (通貨記号など) の場合、InterSystems IRIS は expression の値を 0 に変換します。キャノニック形式への変換では、NumericGroupSeparator 文字、通貨記号、複数の DecimalSeparator 文字、または末尾のプラス符号やマイナス符号を認識しません。InterSystems IRIS での数値からキャノニック形式の数値への変換方法、InterSystems IRIS での非数値文字を含む数値文字列の扱い方の詳細は、"数値" を参照してください。
$JUSTIFY は expression をキャノニック形式の数値として受け取った後、$JUSTIFY はその演算を実行し、"width" で説明しているように、このキャノニック形式の数値を decimal 小数桁数まで丸めるかゼロでパディングしてから、その結果を右寄せします。
width
変換された expression を右寄せする width。width が expression の長さ (数値と小数桁の変換後) より長い場合、InterSystems IRIS は width まで右寄せし、必要に応じて空白スペースで左パディングします。width が expression の長さ (数値と小数桁の変換後) より短い場合、InterSystems IRIS は width を expression 値の長さに設定します。
width には、正の整数を指定します。width 値 0、空文字列 ('')、NULL、または非数値文字列では、width は 0 として扱われます。これは、InterSystems IRIS が width を expression 値の長さに設定することを意味します。
decimal
小数桁数。expression に含まれる小数桁が多い場合は、$JUSTIFY は小数部をこの数の小数桁まで丸めます。expression に含まれる小数桁が少ない場合、$JUSTIFY は小数部をこの小数桁までゼロでパディングして、必要に応じて Decimal Separator 文字を追加します。decimal=0 の場合、$JUSTIFY は expression を整数値まで丸め、Decimal Separator 文字を削除します。
expression 値が 1 未満の場合、$JUSTIFY は DecimalSeparator 文字の前に 0 を挿入します。
$DOUBLE の INF 値、-INF 値、および NAN 値は、decimal 値には関係なく $JUSTIFY によって変更されることなく返されます。
例
以下の例では、文字列に対して右寄せを実行します。数値変換は実行されません。
SELECT TOP 20 Age,$JUSTIFY(Name,18),DOB FROM Sample.Person
以下の例では、指定された小数桁数で数値の右寄せを実行します。
SELECT TOP 20 $JUSTIFY(Salary,10,2) AS FullSalary,
$JUSTIFY(Salary/7,10,2) AS SeventhSalary FROM Sample.Employee
以下の例では、指定された小数桁数での数値の右寄せと、同じ数値の文字列の右寄せを実行します。
"SELECT $JUSTIFY({fn ACOS(-1)},8,3) AS ArcCos3,
$JUSTIFY({fn ACOS(-1)},8) AS ArcCosAll
以下のダイナミック SQL の例では、$DOUBLE 値の INF および NAN を使用して数値の右寄せを実行します。
DO ##class(%SYSTEM.Process).IEEEError(0)
SET x=$DOUBLE(1.2e500)
SET y=x-x
SET myquery = 2
SET myquery(1) = "SELECT $JUSTIFY(?,12,2) AS INFtest,"
SET myquery(2) = "$JUSTIFY(?,12,2) AS NANtest"
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(x,y)
DO rset.%Display()