질의에 문자열 함수 사용

문자열에는 다양한 내장 함수가 있습니다. 모든 문자열에서 위치는 0부터 시작하여 길이 - 1로 끝납니다.

예제와 함께 따르려면 를 참조하여 샘플 데이터를 보고 스크립트를 사용하여 테스트할 샘플 데이터를 로드합니다. 스크립트는 예제에 사용된 테이블을 생성하고 테이블로 데이터를 로드합니다.

예제와 함께 따르려면 쿼리를 실행할 샘플 데이터를 참조하여 샘플 데이터를 보고 OCI 콘솔을 사용하여 예제 테이블을 생성하고 JSON 파일을 사용하여 데이터를 로드하는 방법을 알아봅니다.

부분 문자열 함수

substring 함수는 지정된 숫자 시작 위치 및 지정된 숫자 하위 문자열 길이에 따라 지정된 문자열에서 문자열을 추출합니다.
returnvalue substring (source, position [, substring_length] )

source ::= any*
position ::= integer*
substring_length ::= integer*
returnvalue ::= string
예: 티켓 번호가 1762376407826인 승객의 경로 지정 세부정보에서 처음 3자를 가져옵니다.
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
예: 특정 티켓 번호가 "passenger_name에 대한 경로는 ..."인 고객의 경로 지정을 표시합니다.
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"}

상위 및 하위 기능

upperlower는 각각 전체 대문자 또는 소문자로 변환하는 간단한 함수입니다. upper 함수는 문자열의 모든 문자를 대문자로 변환합니다. lower 함수는 문자열의 모든 문자를 소수로 변환합니다.
returnvalue upper (source)
returnvalue lower (source) 

source ::= any* 
returnvalue ::= string
예 1: 티켓 번호가 1762376407826인 승객의 전체 이름을 대문자로 인출합니다.
SELECT upper(fullname) AS FULLNAME_CAPITALS 
FROM BaggageInfo 
WHERE ticketNo=1762376407826
출력:
{"FULLNAME_CAPITALS":"DIERDRE AMADOR"}
예 2: 티켓 번호가 1762376407826인 소문자로 승객의 전체 이름을 가져옵니다.
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
예: 티켓 번호가 1762350390409인 승객의 경로 세부정보에서 선행 및 후행 공백을 제거합니다.
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
예: 티켓 번호가 1762350390409인 승객의 성명 전체 길이를 찾습니다.
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
예: 경로에 "SFO"가 있는 승객의 전체 이름을 가져옵니다.
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
예: 체크인 시점부터 티켓 번호가 176234463813인 승객의 탑승 시점에 가방이 스캔되는 시간까지 얼마나 걸립니까?
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}
예 2: 대상이 JTR인 승객 목록을 찾습니다.
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 인수가 정수가 아닌 경우 오류를 반환합니다.
예 1: 티켓 번호가 1762320569757인 승객에 대한 첫 번째 구간의 예상 도착 시간에 "-" 위치를 확인합니다.
SELECT index_of(bag.baginfo.flightLegs[0].estimatedArrival,"-")
FROM BaggageInfo bag 
WHERE ticketNo=1762320569757
출력:
{"Column_1":4}
예 2: 티켓 번호가 1762320569757인 승객의 첫 번째 구간 경로 지정에서 "/" 위치를 확인할 수 있습니다. 티켓 번호가 1762320569757인 승객의 소스 포인트에 대한 문자 수를 결정하는 데 도움이 됩니다.
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
예: 여객의 출발지를 SFO에서 SOF까지 티켓 번호 1762320569757로 바꿉니다.
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
예: 전체 이름을 표시하고 티켓 번호가 1762330498104인 승객의 전체 이름을 바꿉니다.
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를 사용합니다.

SQLFunctions.java 예제에서 전체 코드 를 다운로드하십시오.
 //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() 메소드를 사용합니다.

SQLFunctions.py 예제에서 전체 코드 를 다운로드하십시오.
# 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 함수를 사용합니다.

SQLFunctions.go 예제에서 전체 코드 를 다운로드하십시오.
 //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 메소드를 사용합니다.

JavaScript: SQLFunctions.js 예제에서 SQLFunctions.js 전체 코드를 다운로드합니다.
  //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);
   }
}
TypeScript: SQLFunctions.ts 예제에서 SQLFunctions.ts 전체 코드를 다운로드합니다.
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 메소드를 호출하고 결과 비동기 열거 가능을 반복할 수 있습니다.

SQLFunctions.cs 예제에서 전체 코드 를 다운로드하십시오.
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);