クエリで正確にテーブルにレコードを1つ挿入する必要があります。たとえば、精度の高いオラクルで分割して挿入する
私はVARCHAR2としてpurchase_amount列を持っています。このクエリを実行すると、50.495
というように挿入されます。しかし、私は精度の2つの場所を挿入する必要があります。期待される結果は50.49
であるか、または50.50
として切り上げる必要があります。これを達成する方法は?
クエリで正確にテーブルにレコードを1つ挿入する必要があります。たとえば、精度の高いオラクルで分割して挿入する
私はVARCHAR2としてpurchase_amount列を持っています。このクエリを実行すると、50.495
というように挿入されます。しかし、私は精度の2つの場所を挿入する必要があります。期待される結果は50.49
であるか、または50.50
として切り上げる必要があります。これを達成する方法は?
OracleのSQLはround()
機能が含まれています。最初のパラメータは値で、2番目のパラメータは丸めの度合いを制御します。小数点以下2桁に丸めるには:round((100.99/2),2)
。 Find out more。
は、の番号であるため、サンプルコードにto_number()
コールがある理由がわかりません。また、数字の値を文字列として格納するのは本当に悪い考えです。それは生涯の不必要な痛みです。
まず、それはvarchar2
としてpurchase_amount
などの数値を格納するのにも意味がありません。実際には、実際には数字として格納する必要があります。その場合、自動的に指定する精度は実際には決まります。
第二に、それは数値上to_number
を呼び出すしても意味がありません。 to_number
は文字列のみを受け入れます。したがって、数値を渡すと、Oracleは暗黙的に数値を文字列にキャストしなければなりません。to_number
は、文字列を数値に明示的にキャストして、開始した場所に戻ることができます。
あなたは値が50.5に丸めしたい場合は、round
を使用しています。値を50.49に切り捨てる場合は、trunc
を使用します。
insert into spend_amount(record_no, purchase_amount)
values(1, round(100.99/2, 2));
または
insert into spend_amount(record_no, purchase_amount)
values(1, trunc(100.99/2, 2));