Query에서 수학 연산 사용
Oracle NoSQL Database Cloud Service에서 지원되는 수학 함수에 대해 알아봅니다.
수학 함수는 입력 인수에 대한 수학적 계산을 수행하는 데 사용됩니다. 여기서 제공된 인수는 숫자로 분석되는 표현식입니다.
SELECT/WHERE 절과 구문에서 함수 호출이 허용되는 다른 Oracle NoSQL 문에서도 수학적 함수를 호출할 수 있습니다. 예를 들어, 수학적 함수를 집계 함수 사용에 인수로 제공할 수 있습니다.
Oracle NoSQL Database Cloud Service에서 지원되는 기능은 다음과 같습니다.
표 1 - 수학 함수
| 기능 | 설명 |
|---|---|
| abs(n) | 절대값 n을 반환합니다. |
| acos(n) | 라디안으로 표시된 n의 아크코사인을 반환합니다. |
| asin(n) | 라디안으로 표시된 n의 아크사인을 반환합니다. |
| 아탄(n) | 라디안으로 표시된 n의 아크탄젠트를 반환합니다. |
| atan2(n1,n2) | 라디안으로 표현된 인수 n1 및 n2의 아크 탄젠트를 반환합니다. |
| 천장(n) | n보다 크거나같은 가장 작은 자연수를 반환합니다. |
| 코스(n) | 라디안으로 지정된 각도 n의 코사인을 반환합니다. |
| 면(n) | 라디안으로 지정된 각도 n의 코탄젠트를 반환합니다. |
| 도(n) | n을 라디안에서 도로 변환합니다. |
| e() | 오일러 숫자 e의 값을 반환합니다. |
| exp(n) | n 표현식의 지수 값을 반환합니다. |
| 바닥(n) | n보다 작거나 동일한 최대 정수를 반환합니다. |
| ln(n) | n의 자연 로그(기본 e) 값을 반환합니다. |
| 로그(n,b) | n의 대수 기본 b 값을 반환합니다. |
| log10(n) | n의 대수 기본 10 값을 반환합니다. |
| pi() | pi의 값을 반환합니다. |
| 힘 (n2, n1) | n2 값을 전원 n1로 반환합니다. |
| 라디안(n) | n을 도에서 라디안으로 변환합니다. |
| rand() | 0과 1 사이의 의사 난수를 반환합니다. |
| 라운드(n [,d]) | n을 소수점 오른쪽에 있는 d 자릿수로 반올림합니다. |
| 기호(n) | n의 기호를 반환합니다. |
| sin(n) | 라디안으로 지정된 각도 n의 사인을 반환합니다. |
| sqrt(n) | n의 제곱근을 반환합니다. |
| tan(n) | 라디안으로 지정된 각도 n의 탄젠트를 반환합니다. |
| trunc(n [,d]) | n의 값을 소수점 d자릿수로 잘립니다. |
참고:
-
수학 함수 이름은 대소문자를 구분합니다.
-
모든 수학 함수는 숫자 유형(정수, long, float, double 및 number)을 인수로 기대합니다. 이러한 함수는 다음과 같은 경우에 NULL을 반환합니다. 여기서 NULL은 별도로 지정하지 않는 한 SQL NULL을 참조합니다.
-
인수는 모두 NULL로 분석됩니다.
-
인수는 값이 NULL인 JSON 열, 즉 JSON NULL의 필드입니다.
-
인수는 존재하지 않는 JSON 열의 필드입니다.
-
인수는 존재하지 않는 JSON 모음의 필드입니다.
-
인수는 숫자 유형으로 분석되지 않습니다.
-
-
sin(n), cos(n) 등과 같은 삼각 함수를 사용하는 동안 라디안으로 입력 값을 지정해야 합니다. 라디안(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 - 아크 사인 함수
SELECT asin(n) FROM Archery
| n 값 | 출력 |
|---|---|
| 1 | 1.5707963267948966 |
| 제곱근(3)/2 | 1.0471975511965976 |
| 0.5 | 0.5235987755982989 |
| -1 | -1.5707963267948966 |
arc tan 함수
atan 함수는 역삼각 함수입니다. atan 함수는 입력 표현식의 아크 탄젠트(탄젠트 반대)를 반환합니다.
예 1 - arc tan 함수
SELECT atan(n) FROM Archery
| n 값 | 출력 |
|---|---|
| 1 | 0.7853981633974483 |
| 제곱근(3) | 1.0471975511965976 |
아크 tan2 기능
atan2 함수는 역삼각 함수입니다. atan2 함수는 atan(n2/n1)으로 계산된 2차원 공간(n1, n2)에서 좌표 또는 점의 호 탄젠트를 반환하는 2인수 아크 탄젠트(tan 반대) 함수입니다.
예 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 - 코사인 함수
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 |
| 7.0E-1 | -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 |
| 7.0E-1 | -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 - 라디안 함수
SELECT radians(n) FROM Archery
| n 값 | 출력 |
|---|---|
| 180 | 3.141592653589793 |
| 0 | 0.0 |
임의 함수
rand 함수는 양수 의사 난수를 반환합니다. 결과 값은 0 이상이고 1보다 작을 수 있습니다.
예 1 - 임의 함수
SELECT rand() AS RANDOM from Archery WHERE sim=1
출력:
+-----------+-------------------+
| RANDOM | 0.891655403699787 |
+-----------+-------------------+
round 함수
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 함수는 지정된 표현식의 부호, 즉 인수가 0이면 0이고, 인수가 0보다 크면 1이고, 인수가 0보다 작으면 -1을 반환합니다.
예 1 - 기호 함수
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 - 사인 함수
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 |
truncate 함수
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);
}
}
query를 실행하려면 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)
다음 query를 사용하여 수학 함수를 적용하고 테이블에서 필요한 트랜잭션 세부 정보를 검색할 수 있습니다.
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 값을 계산합니다. 함수의 반환 값이 double이므로 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"}