在查詢中使用數學運算
瞭解 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) | 傳回對數基底 b 的 n 值。 |
| 記錄 10 (n) | 傳回對數基底 10 的值 n 。 |
| pi() | 傳回 pi 的值。 |
| 力 (n2,n1) | 傳回乘以 n1 的 n2 值。 |
| 弧度 (n) | 將 n 從度數轉換為弧度。 |
| rand() | 傳回介於 0 與 1 之間的虛擬隨機數字。 |
| 四捨五入 (n [,d]) | 將 n 捨入至小數點右側的 d 位數。 |
| 符號 (n) | 傳回 n 的符號。 |
| 正弦 (n) | 傳回以弧度指定之角度 n 的正弦。 |
| 平方根 (n) | 傳回 n 的平方根。 |
| 棕褐色 | 傳回以弧度指定之角度 n 的正切。 |
| trunc (n [,d]) | 傳回將 n 的值截斷為 d 個小數位數。 |
注意:
-
數學函式名稱會區分大小寫。
-
所有數學函數都預期數值類型 (整數、長整數、浮點數、雙精準數和數字) 為引數。在下列情況下,這些函數會傳回 NULL。除非另有指定,否則 NULL 會參照 SQL NULL。
-
任一引數都會解析為 NULL。
-
任一引數都是 JSON 資料欄中值為 NULL (亦即 JSON NULL) 的欄位。
-
任一引數都是 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 - 反餘弦函數
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"}