問合せでの算術演算の使用
Oracle NoSQL Database Cloud Serviceでサポートされている数学関数について学習します。
数学関数は、入力引数で数学的計算を実行するために使用されます。ここでは、指定された引数は数値に解決される式です。
数学関数は、SELECT/WHERE句から呼び出せます。また、構文で関数コールが許可されているその他のOracle NoSQL文からも呼び出すことができます。たとえば、「集計関数の使用」の引数として数学関数を指定できます。
Oracle NoSQL Database Cloud Serviceでは、次の関数がサポートされています:
表1 - 数学関数
| 機能 | 説明 |
|---|---|
| abs(n) | nの絶対値を返します。 |
| アコス(n) | nのアーク・コサインをラジアンで表現して返します。 |
| アシン(n) | nのアーク・サインをラジアンで表現して返します。 |
| アタン(n) | nのアーク・タンジェントをラジアンで表現して返します。 |
| atan2(n1,n2) | 引数n1およびn2のアーク・タンジェントをラジアンで表現し返します。 |
| 天井(n) | n以上の最小の整数を返します。 |
| cos(n) | 指定された角度nのコサインをラジアンで返します。 |
| コット(n) | 指定された角度 nのコタンジェントをラジアンで返します。 |
| 度(n) | nをラジアンから度に変換します。 |
| (e) | オイラー数eの値を返します。 |
| exp(n) | 式nの指数値を返します。 |
| フロア(n) | n以下の最大の整数を返します。 |
| ln(n) | nの自然対数(基数e)値を返します。 |
| ログ(n、b) | nの対数基数b値を返します。 |
| ログ10(n) | nの対数基数10の値を返します。 |
| pi() | piの値を返します。 |
| パワー(n2、n1) | n1で累乗したn2の値を戻します。 |
| ラジアン(n) | nを度からラジアンに変換します。 |
| rand() | ゼロから1までの疑似乱数を返します。 |
| round(n [,d]) | Rounds n to d places to the right of the decimal point. |
| 符号(n) | nの符号を返します。 |
| sin(n) | 指定された角度nのサインをラジアンで返します。 |
| 平方根(n) | nの平方根を返します。 |
| タン(n) | 指定された角度nのタンジェントをラジアンで返します。 |
| trunc(n [,d]) | nの値を小数第 d位で切り捨てて返します。 |
ノート:
-
数学関数名では、大/小文字が識別されます。
-
すべての数学関数が、引数として数値型(integer、long、float、doubleおよびnumber)を想定しています。次の場合、これらの関数はNULLを返します。ここでは、特に指定されていないかぎり、NULLはSQL NULLを指します。
-
任意の引数がNULLに解決されます。
-
任意の引数が、値がNULL (つまり、JSON NULL)であるJSON列内のフィールドです。
-
任意の引数が、存在しないJSON列のフィールドです。
-
任意の引数が、存在しないJSONコレクションのフィールドです。
-
いずれの引数も、数値型に解決されません。
-
-
sin(n)、cos(n)などの三角関数を使用する場合は、入力値をラジアンで指定する必要があります。radians(n)関数を使用すると、角度を度からラジアンに変換できます。同様に、asin(n)、acos(n)などの逆三角関数では、degrees(n)関数を使用して、結果のラジアン値を度に変換できます。
各項の例に従って、「その他の例」の項で説明されているとおりに、表を作成し、データをロードできます。
abs関数
abs関数は、入力式の絶対値を返します。
例1 - abs関数
SELECT abs(n) FROM Userstocks
| nの値 | 出力 |
|---|---|
| 10 | 10 |
| -10 | 10 |
| 1.67 | 1.67 |
| -1.67 | 1.67 |
アーク・コサイン関数
acos関数は、逆三角関数です。acos関数は、入力式のアーク・コサイン(コサインの逆)を返します。
例1 - arc cosine関数
SELECT acos(n) FROM Archery
| nの値 | 出力 |
|---|---|
| 1 | 0.0 |
| 0 | 1.5707963267948966 |
| SQRT(3)/2 | 0.5235987755982989 |
| 0.5 | 1.0471975511965979 |
| -1 | 3.141592653589793 |
アーク・サイン関数
asin関数は、逆三角関数です。asin関数は、入力式のアーク・サイン(サインの逆)を返します。
例1 - arc sine関数
SELECT asin(n) FROM Archery
| nの値 | 出力 |
|---|---|
| 1 | 1.5707963267948966 |
| SQRT(3)/2 | 1.0471975511965976 |
| 0.5 | 0.5235987755982989 |
| -1 | -1.5707963267948966 |
アーク・タンジェント関数
atan関数は、逆三角関数です。atan関数は、入力式のアーク・タンジェント(タンジェントの逆)を返します。
例1 - arc tan関数
SELECT atan(n) FROM Archery
| nの値 | 出力 |
|---|---|
| 1 | 0.7853981633974483 |
| sqrt(3) | 1.0471975511965976 |
アーク・タンジェント2関数
atan2関数は、逆三角関数です。atan2関数は、atan(n2/n1)として計算された2次元空間(n1, n2)内の座標または点のアーク・タンジェントを返す、2つの引数のアーク・タンジェント(タンジェントの逆)関数です。
例1 - arc tan2関数
SELECT atan2(n1,n2) FROM Archery
| n1の値 | n2の値 | 出力 |
|---|---|---|
| 1 | 1 | 0.7853981633974483 |
| 1 | sqrt(3) | 1.0471975511965976 |
| 2 | 0 | 1.5707963267948966 |
ceil関数
ceil関数は、指定された式以上の最小の整数を戻します。
例1 - ceil関数
SELECT ceil(n) FROM Userstocks
| nの値 | 出力 |
|---|---|
| 1.34 | 2.0 |
| -1.34 | -1.0 |
| pi() | 4.0 |
コサイン関数
cos関数は、三角関数です。cos関数は、ラジアンで指定された角度のコサインを返します。
例1 - cosine関数
SELECT cos(n) FROM Archery
| nの値 | 出力 |
|---|---|
| 0 | 1.0 |
| ラディアン(90) | 6.123233995736766E-17 |
| pi() | -1.0 |
コタンジェント関数
cot関数は、三角関数です。cot関数は、ラジアンで指定された角度のコタンジェントを返します。
例1 - cotangent関数
SELECT cot(n) FROM Archery
| nの値 | 出力 |
|---|---|
| 0 | 無限大 |
| ラディアン(90) | 6.123233995736766E-17 |
| 円()/4 | 1.0000000000000002 |
度関数
degrees関数は、指定した式をラジアンから度に変換します。
例1 - 度関数
SELECT degrees(n) FROM Archery
| nの値 | 出力 |
|---|---|
| pi()/2 | 90 |
| 0 | 0.0 |
オイラー関数
e関数は、オイラー番号eの値(2.718281828459045)を返します。
例1 - Euler関数
SELECT e() AS EULER FROM Archery
出力:
+-----------+-------------------+
| EULER | 2.718281828459045 |
+-----------+-------------------+
exp関数
exp関数は、指定した式の指数値、つまり、指定した式の累乗で累乗したeを返します。ここでは、eは自然対数の基数であり、値は2.718281828459045です。
例1 - exp関数
SELECT exp(n) FROM PHtable
| nの値 | 出力 |
|---|---|
| 0 | 1.0 |
| 2 | 7.38905609893065 |
| -2 | 0.1353352832366127 |
床関数
floor関数は、指定された式以下の最大の整数を返します。
例1 - floor関数
SELECT floor(n) FROM Userstocks
| nの値 | 出力 |
|---|---|
| 1.34 | 1.0 |
| -1.34 | -2.0 |
| pi() | 3.0 |
ln関数
ln関数は、指定された式の自然対数値(基数e)を返します。
例1 - ln関数
SELECT ln(n) FROM PHtable
| nの値 | 出力 |
|---|---|
| 1 | 0.0 |
| 10 | 2.302585092994046 |
| 1.0E-7 | -16.11809565095832 |
ログ関数
log関数は、特定の式に指定された基数を持つ対数値を返します。
例1 - log関数
SELECT log(n,b) FROM PHtable
| nの値 | bの値 | 出力 |
|---|---|---|
| 2 | 2 | 1.0 |
| 81 | 3 | 4.0 |
| 255 | 5 | 3.442980622208573 |
log10関数
log10関数は、指定された式の基数10を持つ対数値を返します。
例1 - log10関数
SELECT log10(n) FROM PHtable
| nの値 | 出力 |
|---|---|
| 1 | 0.0 |
| 10 | 1.0 |
| 1.0E-7 | -7.0 |
pi関数
pi関数は、piの値(3.141592653589793)を返します。
例1 - pi関数
SELECT pi() AS PI FROM Archery
出力:
+-----------+-------------------+
| PI | 3.141592653589793 |
+-----------+-------------------+
べき関数
pow関数は、最初の式の値を2番目の式で累乗して返します。
例1 - 電源機能
SELECT pow(n2,n1) FROM PHtable
| nの値 | bの値 | 出力 |
|---|---|---|
| 2 | 4 | 16.0 |
| 2 | 0 | 1.0 |
| -0.5 | 4 | 0.0625 |
| 0.5 | -4 | 16.0 |
ラジアン関数
radians関数は、指定した式を度からラジアンに変換します。
例1 - ラジアン関数
SELECT radians(n) FROM Archery
| nの値 | 出力 |
|---|---|
| 180 | 3.141592653589793 |
| 0 | 0.0 |
ランダム機能
rand関数は、正の擬似乱数を返します。結果の値は、ゼロ以上1未満になります。
例1 - ランダム関数
SELECT rand() AS RANDOM from Archery WHERE sim=1
出力:
+-----------+-------------------+
| RANDOM | 0.891655403699787 |
+-----------+-------------------+
丸め関数
round関数は、入力式の値を小数点の右側の指定された桁数まで丸めます。
例1 - round関数
SELECT round(n,d) FROM Userstocks
| nの値 | dの値 | 出力 |
|---|---|---|
| 100.331 | 2 | 100.33 |
| 100.367 | 2 | 100.37 |
| 111.567 | 0.5 | 112.0 |
| 111.567 | 4 | 111.567 |
| 10.361 | 0または指定されていません | 10.0 |
| 111.331 | -2 | 100.0 |
| 111.331 | -4 | 0.0 |
| -100.331 | 2 | -100.33 |
| -111.331 | -2 | -100.0 |
符号関数
sign関数は、指定された式の符号を返します。つまり、引数がゼロの場合はゼロ、引数がゼロより大きい場合は1、引数がゼロ未満の場合は-1です。
例1 - sign関数
SELECT sign(n) FROM PHtable
| nの値 | 出力 |
|---|---|
| 1.89 | 1.0 |
| -1.89 | -1.0 |
| 0 | 0.0 |
| sin(3*pi()/2) | -1.0 |
サイン関数
sin関数は、三角関数です。sin関数は、指定された角度のサインをラジアンで返します。
例1 - sine関数
SELECT sin(n) FROM Archery
| nの値 | 出力 |
|---|---|
| ラディアン(90) | 1.0 |
| pi()/4 | 0.7071067811865475 |
| 3*pi()/2 | -1.0 |
平方根関数
sqrt関数は、指定された式の平方根を返します。
例1 - 平方根関数
SELECT sqrt(n) FROM Archery
| nの値 | 出力 |
|---|---|
| 16 | 4.0 |
| 12.57/pi() | 2.00028879648171 |
タンジェント関数
tan関数は、三角関数です。tan関数は、指定された角度のタンジェントをラジアンで返します。
例1 - 接線関数
SELECT tan(n) FROM Archery
| nの値 | 出力 |
|---|---|
| 0 | 0.0 |
| ラディアン(90) | 1.633123935319537E16 |
| pi()/4 | 0.9999999999999999 |
切捨て関数
trunc関数は、入力式の値を小数点の右側の指定された桁数で切り捨てます。
例1 - truncate関数
SELECT trunc(n,d) FROM Userstocks
| nの値 | dの値 | 出力 |
|---|---|---|
| 111.567 | 0または指定されていません | 100.00 |
| 111.567 | 2 | 100.56 |
| 111.567 | 3 | 111.567 |
| 111.567 | -2 | 100.0 |
| 111.567 | -3 | 0.0 |
| -111.567 | 2 | -100.567 |
| -111.567 | -1 | -110.0 |
QueryRequest APIの使用例
QueryRequest APIを使用し、SQL関数を適用して、タイムスタンプ関数および文字列関数と同様にNoSQL表からデータをフェッチできます。
次のコード・スニペットは、数学関数を使用してUserstocks表を問い合せる方法を示しています。
問合せを実行するには、NoSQLHandle.query() APIを使用します。
String queryStatement =
"SELECT stock, " +
"ceil(units * sellRate - units * buyRate) AS PROFIT, " +
"abs(units * sellRate - units * buyRate) AS TURNOVER, " +
"round(abs(units * sellRate - units * buyRate) * 0.5 / 100, 2) " +
"AS BROKERAGE " +
"FROM Userstocks";
try (QueryRequest request =
new QueryRequest().setStatement(queryStatement);
QueryIterableResult results = handle.queryIterable(request)) {
for (MapValue row : results) {
System.out.println(row);
}
}
問合せを実行するには、borneo.NoSQLHandle.query()メソッドを使用します。
query_statement = '''
SELECT stock,
ceil(units * sellRate - units * buyRate) AS PROFIT,
abs(units * sellRate - units * buyRate) AS TURNOVER,
round(
abs(units * sellRate - units * buyRate) * 0.5 / 100,
2
) AS BROKERAGE
FROM Userstocks
'''
request = QueryRequest().set_statement(query_statement)
while True:
result = handle.query(request)
for row in result.get_results():
print(row)
if request.is_done():
break
問合せを実行するには、Client.Query関数を使用します。
queryStatement := `
SELECT stock,
ceil(units * sellRate - units * buyRate) AS PROFIT,
abs(units * sellRate - units * buyRate) AS TURNOVER,
round(
abs(units * sellRate - units * buyRate) * 0.5 / 100,
2
) AS BROKERAGE
FROM Userstocks`
prepareRequest := &nosqldb.PrepareRequest{
Statement: queryStatement,
}
prepareResult, err := client.Prepare(prepareRequest)
if err != nil {
fmt.Println("Prepare failed:", err)
return
}
queryRequest := &nosqldb.QueryRequest{
PreparedStatement: &prepareResult.PreparedStatement,
}
for {
queryResult, err := client.Query(queryRequest)
if err != nil {
fmt.Println("Query failed:", err)
return
}
rows, err := queryResult.GetResults()
if err != nil {
fmt.Println("Unable to get results:", err)
return
}
for _, row := range rows {
fmt.Println(jsonutil.AsJSON(row.Map()))
}
if queryRequest.IsDone() {
break
}
}
問合せを実行するには、queryメソッドを使用します。
const queryStatement = `
SELECT stock,
ceil(units * sellRate - units * buyRate) AS PROFIT,
abs(units * sellRate - units * buyRate) AS TURNOVER,
round(
abs(units * sellRate - units * buyRate) * 0.5 / 100,
2
) AS BROKERAGE
FROM Userstocks`;
const options = {};
do {
const result = await handle.query(queryStatement, options);
for (const row of result.rows) {
console.log(row);
}
options.continuationKey = result.continuationKey;
} while (options.continuationKey);
問合せを実行するには、QueryAsyncメソッドをコールするか、GetQueryAsyncEnumerableメソッドをコールして、結果の非同期列挙可能性に対して反復処理します。
private const string QueryStatement = @"
SELECT stock,
ceil(units * sellRate - units * buyRate) AS PROFIT,
abs(units * sellRate - units * buyRate) AS TURNOVER,
round(
abs(units * sellRate - units * buyRate) * 0.5 / 100,
2
) AS BROKERAGE
FROM Userstocks";
var queryEnumerable =
client.GetQueryAsyncEnumerable(QueryStatement);
await foreach (var result in queryEnumerable)
{
foreach (var row in result.Rows)
{
Console.WriteLine(row.ToJsonString());
}
}
その他の例
アプリケーションでの数学関数の使用について学習します。
例1 - 日中取引を取引アプリケーションから取得するための数学関数の適用
取引アプリケーションでの株式トレーダーの1日の取引を含むUserstocks表について考えてみます。
表のDDLは次のとおりです。
CREATE TABLE Userstocks (id INTEGER,
stock STRING,
units INTEGER,
buyRate DOUBLE,
sellRate DOUBLE,
PRIMARY KEY (id))
idフィールドには会社のIDが含まれ、stockフィールドにはユーザーがストック・オプションを持つ会社名が含まれ、unitsフィールドにはユーザーが所有する株式数が含まれ、buyRateはユーザーが株式を購入した価格であり、sellRateはユーザーが株式を売却した価格です。
表にサンプル行を挿入します:
INSERT into Userstocks VALUES (1, "company1", 100, 10.2, 11.5)
INSERT into Userstocks VALUES (2, "company2", 20, 15, 14.7)
次の問合せを使用して、数学関数を適用し、必要な取引の詳細を表から取得できます:
SELECT stock,
ceil(units*sellRate-units*buyRate) AS PROFIT,
abs(units*sellRate-units*buyRate) AS TURNOVER,
round(abs(units*sellRate-units*buyRate)*0.5/100, 2) AS BROKERAGE
FROM Userstocks
説明: 上の問合せでは、その日の売上高、損益および仲介手数料をフェッチします。損益は、指定された算術式を使用して計算し、ceil関数を適用して、結果を最も近い整数値として取得します。損益を計算し、abs関数を適用して各取引の出来高を計算します。各出来高に0.5%を適用して仲介手数料を計算し、round関数を使用して結果を小数点以下2桁に丸めます。
出力:
{"stock":"company2","PROFIT":-6.0,"TURNOVER":6.0,"BROKERAGE":0.03}
{"stock":"company1","PROFIT":131.0,"TURNOVER":130.0000000000001,"BROKERAGE":0.65}
例2 - ゲーム・アプリケーションで射撃距離を計算するための数学関数の適用
ゲーム・アプリケーションでの標的射撃のデータを含むArchery表について考えてみます。
表のDDLは次のとおりです。
CREATE TABLE Archery (sim INTEGER,
angle DOUBLE,
elevation DOUBLE,
PRIMARY KEY (sim) )
simフィールドはシミュレーション数を示し、angleフィールドにはゲーマーが標的を狙うことができる様々な角度(度単位)が含まれ、elevationフィールドには標的が配置される高さ(メートル単位)が含まれます。
表にサンプル行を挿入します:
INSERT INTO Archery VALUES (1, 30, 50)
INSERT INTO Archery VALUES (2, 45, 50)
INSERT INTO Archery VALUES (3, 70, 95)
次の問合せで数学関数を適用して、標的の様々な角度と高さについて射撃距離を計算できます。
SELECT sim, trunc(elevation/sin(radians(angle)),2) AS SLOPE FROM Archery ORDER BY
sim
説明: 特定の標高に配置された標的を当てるために、ゲーマは一定の角度で狙われて一定の距離を撃ちます。これらの要素は、直角三角形の一辺、鋭角および斜辺を形成します。この問合せでは、標的からのゲーマーの位置に基づいて、標的の標高と角度の様々な組合せの射撃距離を計算します。radians関数を使用して、角度をラジアンに変換し、sine関数を使用してサイン値を計算します。高さをサイン値で除算して距離を計算し、truncate関数を使用して結果を小数点以下2桁に切り捨てます。
出力:
{"sim":1,"SLOPE ":100.0}
{"sim":2,"SLOPE ":70.71}
{"sim":3,"SLOPE ":101.09}
例3 - 特定の溶液のPH値を計算するための数学関数の使用
様々な溶液の水素イオン濃度を含むPHtableについて考えてみます。
表のDDLは次のとおりです。
CREATE TABLE PHtable (id INTEGER,
sampleName STRING,
hIons DOUBLE,
phValue DOUBLE,
PRIMARY KEY (id) )
idフィールドには溶液サンプルの識別子が含まれ、sampleNameフィールドには特定のサンプルの名前が含まれ、hIonsフィールドは液体のリットル当たりのモル数の水素イオン濃度、phValueフィールドは溶液のPH値です。hIons値を使用して、溶液のphValueを計算できます。表へのデータの挿入中に、phValue列をNULLに初期化します。
表にサンプル行を挿入します:
INSERT INTO PHtable VALUES (1, "sample1", 0.0063095734448019, NULL)
INSERT INTO PHtable VALUES (2, "sample2", 5.0118723362727E-9, NULL)
INSERT INTO PHtable VALUES (3, "sample3", 1.0E-7, NULL)
数学関数を使用すると、特定の溶液のPH値を計算し、次の問合せを使用して表を更新できます:
UPDATE PHtable SET phValue=trunc((log10(1/hIons)),1) where id=1 RETURNING
*
説明: PH値は、溶液内の酸または塩基の強度を示します。この問合せでは、log10関数を使用して、式PH=log10(1/hIons)を使用してソリューションのPH値を計算します。関数の戻り値はdoubleであるため、truncate関数を使用して結果を小数点以下1桁に切り捨てます。UPDATE文を使用して、指定したソリューションのphValueフィールドに結果のPH値を設定します。
出力:
{"id":1,"sampleName":"sample1","hIons":0.0063095734448019,"phValue":2.2}
WHERE句で数学関数を使用することもできます。この例では、次の問合せを使用して酸性サンプル(PH < 7)を見つけます:
SELECT sampleName AS ACIDIC FROM PHtable WHERE trunc((log10(1/hIons)),1) <
7.0
出力:
{"ACIDIC":"sample1"}