問合せでの算術演算の使用

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位で切り捨てて返します。

ノート:

各項の例に従って、「その他の例」の項で説明されているとおりに、表を作成し、データをロードできます。

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"}