질의에 문자열 함수 사용
문자열에는 다양한 내장 함수가 있습니다. 모든 문자열에서 위치는 0부터 시작하여 길이 - 1로 끝납니다.
예제와 함께 따르려면 를 참조하여 샘플 데이터를 보고 스크립트를 사용하여 테스트할 샘플 데이터를 로드합니다. 스크립트는 예제에 사용된 테이블을 생성하고 테이블로 데이터를 로드합니다.
예제와 함께 따르려면 쿼리를 실행할 샘플 데이터를 참조하여 샘플 데이터를 보고 OCI 콘솔을 사용하여 예제 테이블을 생성하고 JSON 파일을 사용하여 데이터를 로드하는 방법을 알아봅니다.
부분 문자열 함수
substring
함수는 지정된 숫자 시작 위치 및 지정된 숫자 하위 문자열 길이에 따라 지정된 문자열에서 문자열을 추출합니다.
returnvalue substring (source, position [, substring_length] )
source ::= any*
position ::= integer*
substring_length ::= integer*
returnvalue ::= string
SELECT substring(bag.baginfo.routing,0,3) AS Source
FROM baggageInfo bag
WHERE ticketNo=1762376407826
{"Source":"JFK"}
concat 함수
concat
함수는 모든 인수를 연결하고 연결된 문자열을 출력으로 표시합니다.returnvalue concat (source,[source*])
source ::= any*
returnvalue ::= string
SELECT concat("The route for passenger ",fullName , " is ", bag.baginfo[0].routing)
FROM baggageInfo bag
WHERE ticketNo=1762376407826
{"Column_1":"The route for passenger Dierdre Amador is JFK/MAD"}
상위 및 하위 기능
upper
및 lower
는 각각 전체 대문자 또는 소문자로 변환하는 간단한 함수입니다. upper
함수는 문자열의 모든 문자를 대문자로 변환합니다. lower
함수는 문자열의 모든 문자를 소수로 변환합니다.returnvalue upper (source)
returnvalue lower (source)
source ::= any*
returnvalue ::= string
SELECT upper(fullname) AS FULLNAME_CAPITALS
FROM BaggageInfo
WHERE ticketNo=1762376407826
{"FULLNAME_CAPITALS":"DIERDRE AMADOR"}
SELECT lower(fullname) AS fullname_lowercase
FROM BaggageInfo WHERE ticketNo=1762376407826
{"fullname_lowercase":"dierdre amador"}
trim 함수
trim
함수를 사용하면 문자열에서 앞 또는 뒤 문자를 자를 수 있습니다(또는 둘 다). ltrim
함수를 사용하면 문자열에서 선행 문자를 정리할 수 있습니다. rtrim
함수를 사용하면 문자열에서 후행 문자를 자를 수 있습니다.returnvalue trim(source [, position [, trim_character]])
source ::= any*
position ::= "leading"|"trailing"|"both"
trim_character ::= string*
returnvalue ::= string
returnvalue ltrim(source)
returnvalue rtrim(source)
source ::= any*
returnvalue ::= string
SELECT trim(bag.baginfo[0].routing,"trailing"," ")
FROM BaggageInfo bag
WHERE ticketNo=1762376407826
{"Column_1":"JFK/MAD"}
ltrim
함수를 사용하여 선행 공백 제거:SELECT ltrim(bag.baginfo[0].routing)
FROM BaggageInfo bag
WHERE ticketNo=1762376407826
{"Column_1":"JFK/MAD"}
rtrim
함수를 사용하여 후행 공백 제거:SELECT rtrim(bag.baginfo[0].routing)
FROM BaggageInfo bag
WHERE ticketNo=1762376407826
{"Column_1":"JFK/MAD"}
length 함수
length
함수는 문자열 길이를 반환합니다. 길이 함수는 UTF 문자 집합을 사용하여 길이를 계산합니다.returnvalue length(source)
source ::= any*
returnvalue ::= integer
SELECT fullname, length(fullname) AS fullname_length
FROM BaggageInfo
WHERE ticketNo=1762350390409
{"fullname":"Fallon Clements","fullname_length":15}
함수 포함
contains
함수는 검색 문자열이 소스 문자열 내에 있는지 여부를 나타냅니다.returnvalue contains(source, search_string)
source ::= any*
search_string ::= any*
returnvalue ::= boolean
SELECT fullname FROM baggageInfo bag
WHERE EXISTS bag.bagInfo[contains($element.routing,"SFO")]
{"fullname":"Michelle Payne"}
{"fullname":"Lucinda Beckman"}
{"fullname":"Henry Jenkins"}
{"fullname":"Lorenzo Phil"}
{"fullname":"Gerard Greene"}
starts_with 및 ends_with 함수
starts_with
함수는 소스 문자열이 검색 문자열로 시작하는지 여부를 나타냅니다.returnvalue starts_with(source, search_string)
source ::= any*
search_string ::= any*
returnvalue ::= boolean
ends_with
함수는 소스 문자열이 검색 문자열로 끝나는지 여부를 나타냅니다.returnvalue ends_with(source, search_string)
source ::= any*
search_string ::= any*
returnvalue ::= boolean
SELECT $flightLeg.flightNo,
$flightLeg.actions[contains($element.actionCode, "Checkin")].actionTime AS checkinTime,
$flightLeg.actions[contains($element.actionCode, "BagTag Scan")].actionTime AS bagScanTime,
timestamp_diff(
$flightLeg.actions[contains($element.actionCode, "Checkin")].actionTime,
$flightLeg.actions[contains($element.actionCode, "BagTag Scan")].actionTime
) AS diff
FROM baggageinfo $s, $s.bagInfo[].flightLegs[] AS $flightLeg
WHERE ticketNo=176234463813
AND starts_with($s.bagInfo[].routing, $flightLeg.fltRouteSrc)
설명: 수하물 데이터에서 모든 flightLeg
에 작업 배열이 있습니다. 작업 배열에는 세 가지 다른 작업이 있습니다. 배열의 첫 번째 항목에 대한 작업 코드는 체크인/오프로드입니다. 첫 번째 다리의 경우 동작 코드는 체크 인이고 다른 다리의 경우 동작 코드는 홉에서 오프로드입니다. 배열의 두번째 요소에 대한 작업 코드는 BagTag Scan입니다. 위 질의에서 백 태그 스캔과 체크인 시간 간의 작업 시간 차이를 확인합니다. 작업 코드가 체크인 또는 BagScan인 경우에만 contains
함수를 사용하여 작업 시간을 필터링합니다. 첫 번째 항공편 구간에만 체크인 및 백 스캔 세부정보가 있으므로 starts_with
함수를 사용하여 데이터를 필터링하여 소스 코드 fltRouteSrc
만 인출합니다.
{"flightNo":"BM572","checkinTime":"2019-03-02T03:28:00Z",
"bagScanTime":"2019-03-02T04:52:00Z","diff":-5040000}
SELECT fullname FROM baggageInfo $bagInfo
WHERE ends_with($bagInfo.bagInfo[].routing, "JTR")
{"fullname":"Lucinda Beckman"}
{"fullname":"Gerard Greene"}
{"fullname":"Michelle Payne"}
index_of 함수
index_of
함수는 검색 문자열의 첫 번째 문자(있을 경우)의 위치를 결정합니다.returnvalue index_of(source, search_string [, start_position])
source ::= any*
search_string ::= any*
start_position ::= integer*
returnvalue ::= integer
- 첫번째 발생 시 검색 문자열의 첫번째 문자 위치를 반환합니다. 위치는 문자열의 시작 위치(0)를 기준으로 합니다.
search_string
가 소스에 없으면 -1을 반환합니다.search_string
의 길이가 0인 경우 소스 값에 대해 0을 반환합니다.- 인수가 NULL인 경우 NULL을 반환합니다.
- 인수가 빈 시퀀스이거나 항목이 두 개 이상인 시퀀스인 경우 NULL을 반환합니다.
start_position
인수가 정수가 아닌 경우 오류를 반환합니다.
SELECT index_of(bag.baginfo.flightLegs[0].estimatedArrival,"-")
FROM BaggageInfo bag
WHERE ticketNo=1762320569757
{"Column_1":4}
SELECT index_of(bag.baginfo.routing,"/")
FROM BaggageInfo bag
WHERE ticketNo=1762320569757
"Column_1":3}
함수 대체
replace
함수는 검색 문자열이 발생할 때마다 소스를 반환하고 해당 소스를 대체 문자열로 바꿉니다.
returnvalue replace(source, search_string [, replacement_string])
source ::= any*
search_string ::= any*
replacement_string ::= any*
returnvalue ::= string
SELECT replace(bag.bagInfo[0].routing,"SFO","SOF")
FROM baggageInfo bag
WHERE ticketNo=1762320569757
{"Column_1":"SOF/IST/ATH/JTR"}
예 2: 승객 이름의 큰 따옴표를 작은 따옴표로 바꿉니다.
SELECT fullname,
replace(fullname, "\"", "'") as new_fullname
FROM BaggageInfo bag
역함수
reverse
함수는 소스 문자열의 문자를 역순으로 반환합니다. 여기서 문자열은 마지막 문자로 시작하여 먼저 기록됩니다.returnvalue reverse(source)
source ::= any*
returnvalue ::= string
SELECT fullname, reverse(fullname)
FROM baggageInfo
WHERE ticketNo=1762330498104
{"fullname":"Michelle Payne","Column_2":"enyaP ellehciM"}
QueryRequest API 사용 예제
QueryRequest
API 및 SQL 함수를 적용하여 NoSQL 테이블에서 데이터를 인출할 수 있습니다.
질의를 실행하려면 NoSQLHandle.query()
API를 사용합니다.
//Fetch rows from the table
private static void fetchRows(NoSQLHandle handle,String sqlstmt) throws Exception {
try (
QueryRequest queryRequest = new QueryRequest().setStatement(sqlstmt);
QueryIterableResult results = handle.queryIterable(queryRequest)){
for (MapValue res : results) {
System.out.println("\t" + res);
}
}
}
String string_func1="SELECT substring(bag.baginfo.routing,0,3) AS Source FROM baggageInfo bag WHERE ticketNo=1762376407826";
System.out.println("Using substring function ");
fetchRows(handle,string_func1);
String string_func2="SELECT fullname, length(fullname) AS fullname_length FROM BaggageInfo WHERE ticketNo=1762320369957";
System.out.println("Using length function ");
fetchRows(handle,string_func2);
String string_func3="SELECT fullname FROM baggageInfo bag WHERE EXISTS bag.bagInfo[contains($element.routing,\"SFO\")]";
System.out.println("Using contains function ");
fetchRows(handle,string_func3);
질의를 실행하려면 borneo.NoSQLHandle.query()
메소드를 사용합니다.
# Fetch data from the table
def fetch_data(handle,sqlstmt):
request = QueryRequest().set_statement(sqlstmt)
print('Query results for: ' + sqlstmt)
result = handle.query(request)
for r in result.get_results():
print('\t' + str(r))
string_func1 = '''SELECT substring(bag.baginfo.routing,0,3) AS Source FROM baggageInfo bag
WHERE ticketNo=1762376407826'''
print('Using substring function:')
fetch_data(handle,string_func1)
string_func2 = '''SELECT fullname, length(fullname) AS fullname_length FROM BaggageInfo
WHERE ticketNo=1762320369957'''
print('Using length function:')
fetch_data(handle,string_func2)
string_func3 = '''SELECT fullname FROM baggageInfo bag WHERE
EXISTS bag.bagInfo[contains($element.routing,"SFO")]'''
print('Using contains function:')
fetch_data(handle,string_func3)
질의를 실행하려면 Client.Query
함수를 사용합니다.
//fetch data from the table
func fetchData(client *nosqldb.Client, err error, tableName string, querystmt string)(){
prepReq := &nosqldb.PrepareRequest{
Statement: querystmt,
}
prepRes, err := client.Prepare(prepReq)
if err != nil {
fmt.Printf("Prepare failed: %v\n", err)
return
}
queryReq := &nosqldb.QueryRequest{
PreparedStatement: &prepRes.PreparedStatement, }
var results []*types.MapValue
for {
queryRes, err := client.Query(queryReq)
if err != nil {
fmt.Printf("Query failed: %v\n", err)
return
}
res, err := queryRes.GetResults()
if err != nil {
fmt.Printf("GetResults() failed: %v\n", err)
return
}
results = append(results, res...)
if queryReq.IsDone() {
break
}
}
for i, r := range results {
fmt.Printf("\t%d: %s\n", i+1, jsonutil.AsJSON(r.Map()))
}
}
string_func1 := `SELECT substring(bag.baginfo.routing,0,3) AS Source FROM baggageInfo bag
WHERE ticketNo=1762376407826`
fmt.Printf("Using substring function:\n")
fetchData(client, err,tableName,string_func1)
string_func2 := `SELECT fullname, length(fullname) AS fullname_length FROM BaggageInfo
WHERE ticketNo=1762320369957`
fmt.Printf("Using length function:\n")
fetchData(client, err,tableName,string_func2)
string_func3 := `SELECT fullname FROM baggageInfo bag WHERE
EXISTS bag.bagInfo[contains($element.routing,"SFO")]`
fmt.Printf("Using contains function:\n")
fetchData(client, err,tableName,string_func3)
질의를 실행하려면 query
메소드를 사용합니다.
//fetches data from the table
async function fetchData(handle,querystmt) {
const opt = {};
try {
do {
const result = await handle.query(querystmt, opt);
for(let row of result.rows) {
console.log(' %O', row);
}
opt.continuationKey = result.continuationKey;
} while(opt.continuationKey);
} catch(error) {
console.error(' Error: ' + error.message);
}
}
interface StreamInt {
acct_Id: Integer;
profile_name: String;
account_expiry: TIMESTAMP;
acct_data: JSON;
}
/* fetches data from the table */
async function fetchData(handle: NoSQLClient,querystmt: any) {
const opt = {};
try {
do {
const result = await handle.query<StreamInt>(querystmt, opt);
for(let row of result.rows) {
console.log(' %O', row);
}
opt.continuationKey = result.continuationKey;
} while(opt.continuationKey);
} catch(error) {
console.error(' Error: ' + error.message);
}
}
const string_func1 = `SELECT substring(bag.baginfo.routing,0,3) AS Source FROM baggageInfo bag
WHERE ticketNo=1762376407826`
console.log("Using substring function:");
await fetchData(handle,string_func1);
const string_func2 = `SELECT fullname, length(fullname) AS fullname_length FROM BaggageInfo
WHERE ticketNo=1762320369957`
console.log("Using length function");
await fetchData(handle,string_func2);
const string_func3 = `SELECT fullname FROM baggageInfo bag WHERE
EXISTS bag.bagInfo[contains($element.routing,"SFO")]`
console.log("Using contains function");
await fetchData(handle,string_func3);
질의를 실행하려면 QueryAsync
메소드를 호출하거나 GetQueryAsyncEnumerable
메소드를 호출하고 결과 비동기 열거 가능을 반복할 수 있습니다.
private static async Task fetchData(NoSQLClient client,String querystmt){
var queryEnumerable = client.GetQueryAsyncEnumerable(querystmt);
await DoQuery(queryEnumerable);
}
private static async Task DoQuery(IAsyncEnumerable<QueryResult<RecordValue>> queryEnumerable){
Console.WriteLine(" Query results:");
await foreach (var result in queryEnumerable) {
foreach (var row in result.Rows)
{
Console.WriteLine();
Console.WriteLine(row.ToJsonString());
}
}
}
private const string string_func1 =@"SELECT substring(bag.baginfo.routing,0,3) AS Source FROM baggageInfo bag
WHERE ticketNo=1762376407826" ;
Console.WriteLine("\nUsing substring function!");
await fetchData(client,string_func1);
private const string string_func2 =@"SELECT fullname, length(fullname) AS fullname_length FROM BaggageInfo
WHERE ticketNo=1762320369957";
Console.WriteLine("\nUsing length function!");
await fetchData(client,string_func2);
private const string string_func3 =@"SELECT fullname FROM baggageInfo bag WHERE
EXISTS bag.bagInfo[contains($element.routing,""SFO"")]";
Console.WriteLine("\nUsing contains function!");
await fetchData(client,string_func3);