在查詢中使用數學運算

瞭解 Oracle NoSQL Database Cloud Service 中支援的數學函數。

數學函式用於在輸入引數上執行數學計算。此處提供的引數是解析為數字的表示式。

您可以從 SELECT/WHERE 子句呼叫數學函數,也可以從語法中允許函數呼叫的其他 Oracle NoSQL 敘述句呼叫該敘述句。例如,您可以提供數學函式作為使用聚總函式的引數。

Oracle NoSQL Database Cloud Service 支援下列函數:

表 1 - 數學函數

函數 描述
abs (n) 傳回 n 的絕對值。
acos (n) 傳回以弧度表示的 n 反餘弦。
asin (n) 傳回 n 的弧正弦 (以弧度表示)。
atan (n) 傳回以弧度表示的弧度正切 n
atan2 (n1,n2) 傳回引數 n1 的反正切,並以弧度表示的 n2
天花板 (n) 傳回大於或等於 n 的最小整數。
cos (n) 傳回以弧度指定之角度 n 的餘弦。
棉 (n) 傳回以弧度指定之角度 n 的餘切。
度 (n) n 從弧度轉換為度。
e() 傳回尤拉數字 e 的值。
指數 (n) 傳回表示式 n 的指數值。
地板 (n) 傳回小於或等於 n 的最大整數。
ln (n) 傳回 n 的自然對數 (以 e 為基礎) 值。
日誌 (n,b) 傳回對數基底 bn 值。
記錄 10 (n) 傳回對數基底 10 的值 n
pi() 傳回 pi 的值。
力 (n2,n1) 傳回乘以 n1n2 值。
弧度 (n) n 從度數轉換為弧度。
rand() 傳回介於 0 與 1 之間的虛擬隨機數字。
四捨五入 (n [,d]) n 捨入至小數點右側的 d 位數。
符號 (n) 傳回 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 - 反餘弦函數

SELECT acos(n) FROM Archery
n 的值 輸出
1 0.0
0 1.5707963267948966
平方根 (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
平方根 (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
平方根 (3) 1.0471975511965976

電弧槽 2 功能

atan2 函數是反三角函數。atan2 函數是雙引數的反正切函數,會傳回以 atan (n2/n1) 計算的二維空間 (n1,n2) 中座標或點的反正切函數。

範例 1 - arc tan2 函數

SELECT atan2(n1,n2) FROM Archery
n1 的值 n2 的值 輸出
1 1 0.7853981633974483
1 平方根 (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 - 餘切函數

SELECT cot(n) FROM Archery
n 的值 輸出
0 無限大
弧度 (90) 6.123233995736766E-17
pi()/4 1.0000000000000002

度函數

degrees 函數會將指定的表示式從弧度轉換為度。

範例 1 - 度函數

SELECT degrees(n) FROM Archery
n 的值 輸出
pi() /2 90
0 0.0

尤拉函數

e 函數會傳回尤拉數字 e 的值,亦即 2.718281828459045

範例 1 - 尤拉函數

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 - 樓層函數

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 函數

log 函數會傳回所指定表示式之指定基底的對數值。

範例 1 - 日誌函數

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 函數會傳回第一個表示式的值給第二個表示式的次方。

範例 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 - radians 函數

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 - 捨入函數

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 - 套用數學函數以從交易應用程式擷取當日交易

例如 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% 來計算經紀費,並將結果四捨五入成兩個小數位數。

輸出:

{"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) )

模擬欄位可識別模擬計數,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

說明:若要擊中放置在特定高程的目標,遊戲玩家會朝角度目標並射擊特定距離。這些元素構成右角三角形的一側、急性角度和連字號。在此查詢中,您可以根據遊戲玩家在目標中的位置,計算各種目標高度和角度的組合拍攝距離。您可以使用弧度函數將角度轉換為弧度,並使用正弦函數計算正弦值。您可以使用截斷函數將高程除以正弦值,以計算距離並將結果截斷為兩個小數位數。

輸出:

{"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 值。由於函數的傳回值是雙精度浮點數,因此您可以使用 truncate 函數將結果截斷成一個小數位數。您可以使用 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"}