Query에서 String 함수 사용

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

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

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

substring 함수

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

예: 특정 티켓 번호가 "The route for passenger_name is …"인 고객의 경로 지정을 표시합니다.

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 함수는 문자열의 길이를 반환합니다. 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

다양한 반환 값:

예 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);

query를 실행하려면 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 예제의 전체 코드를 다운로드하십시오.

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

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);

관련 항목