Utilizzo delle funzioni stringa nelle query

Ci sono varie funzioni integrate sulle stringhe. In qualsiasi stringa, la posizione inizia da 0 e termina alla lunghezza - 1.

Se si desidera seguire gli esempi, vedere Dati di esempio per eseguire le query per visualizzare i dati di esempio e utilizzare gli script per caricare i dati di esempio per i test. Gli script creano le tabelle utilizzate negli esempi e caricano i dati nelle tabelle.

Se si desidera seguire gli esempi, vedere Dati di esempio per eseguire le query per visualizzare dati di esempio e imparare a utilizzare OCI Console per creare le tabelle di esempio e caricare i dati utilizzando i file JSON.

funzione sottostringa

La funzione substring estrae una stringa da una determinata stringa in base a una determinata posizione iniziale numerica e a una determinata lunghezza della sottostringa numerica.

returnvalue substring (source, position [, substring_length] )

source ::= any*
position ::= integer*
substring_length ::= integer*
returnvalue ::= string

Esempio: recuperare i primi tre caratteri dai dettagli di instradamento di un passeggero con numero di biglietto 1762376407826.

SELECT substring(bag.baginfo.routing,0,3) AS Source
FROM baggageInfo bag
WHERE ticketNo=1762376407826

Output:

{"Source":"JFK"}

funzione concat

La funzione concat concatena tutti gli argomenti e visualizza la stringa concatenata come output.

returnvalue concat (source,[source*])
source ::= any*
returnvalue ::= string

Esempio: visualizzare l'instradamento di un cliente con un numero di biglietto specifico come "L'instradamento per il nome del passeggero è …".

SELECT concat("The route for passenger ",fullName , " is ", bag.baginfo[0].routing)
FROM baggageInfo bag
WHERE ticketNo=1762376407826

Output:

{"Column_1":"The route for passenger Dierdre Amador is JFK/MAD"}

funzioni superiore e inferiore

Le funzioni upper e lower sono semplici da convertire rispettivamente in lettere maiuscole o minuscole. La funzione upper converte tutti i caratteri di una stringa in maiuscoli. La funzione lower converte tutti i caratteri di una stringa in minuscoli.

returnvalue upper (source)
returnvalue lower (source)

source ::= any*
returnvalue ::= string

Esempio 1: recuperare il nome completo del passeggero in maiuscolo il cui numero di biglietto è 1762376407826.

SELECT upper(fullname) AS FULLNAME_CAPITALS
FROM BaggageInfo
WHERE ticketNo=1762376407826

Output:

{"FULLNAME_CAPITALS":"DIERDRE AMADOR"}

Esempio 2: recuperare il nome completo del passeggero in minuscolo il cui numero di biglietto è 1762376407826.

SELECT lower(fullname) AS fullname_lowercase
FROM BaggageInfo WHERE ticketNo=1762376407826

Output:

{"fullname_lowercase":"dierdre amador"}

funzione trim

La funzione trim consente di tagliare i caratteri iniziali o finali (o entrambi) da una stringa. La funzione ltrim consente di tagliare i caratteri iniziali da una stringa. La funzione rtrim consente di eliminare i caratteri finali da una stringa.

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

Esempio: rimuovere gli spazi vuoti iniziali e finali dai dettagli del percorso del passeggero con numero di biglietto 1762350390409.

SELECT trim(bag.baginfo[0].routing,"trailing"," ")
FROM BaggageInfo bag
WHERE ticketNo=1762376407826

Output:

{"Column_1":"JFK/MAD"}

Utilizzo della funzione ltrim per rimuovere gli spazi iniziali:

SELECT ltrim(bag.baginfo[0].routing)
FROM BaggageInfo bag
WHERE ticketNo=1762376407826

Output:

{"Column_1":"JFK/MAD"}

Utilizzo della funzione rtrim per rimuovere gli spazi finali:

SELECT rtrim(bag.baginfo[0].routing)
FROM BaggageInfo bag
WHERE ticketNo=1762376407826

Output:

{"Column_1":"JFK/MAD"}

funzione lunghezza

La funzione length restituisce la lunghezza di una stringa di caratteri. La funzione length calcola la lunghezza utilizzando il set di caratteri UTF.

returnvalue length(source)

source ::= any*
returnvalue ::= integer

Esempio: trovare la lunghezza del nome completo del passeggero il cui numero di biglietto è 1762350390409.

SELECT fullname, length(fullname) AS fullname_length
FROM BaggageInfo
WHERE ticketNo=1762350390409

Output:

{"fullname":"Fallon Clements","fullname_length":15}

contiene una funzione

La funzione contains indica se è presente o meno una stringa di ricerca all'interno della stringa di origine.

returnvalue contains(source, search_string)

source ::= any*
search_string ::= any*
returnvalue ::= boolean

Esempio: recuperare i nomi completi dei passeggeri che hanno "SFO" sulla loro rotta.

SELECT fullname FROM baggageInfo bag
WHERE EXISTS bag.bagInfo[contains($element.routing,"SFO")]

Output:

{"fullname":"Michelle Payne"}
{"fullname":"Lucinda Beckman"}
{"fullname":"Henry Jenkins"}
{"fullname":"Lorenzo Phil"}
{"fullname":"Gerard Greene"}

start_with e ends_with funzioni

La funzione starts_with indica se la stringa di origine inizia o meno con la stringa di ricerca.

returnvalue starts_with(source, search_string)

source ::= any*
search_string ::= any*
returnvalue ::= boolean

La funzione ends_with indica se la stringa di origine termina con la stringa di ricerca.

returnvalue ends_with(source, search_string)

source ::= any*
search_string ::= any*
returnvalue ::= boolean

Esempio: quanto tempo occorre dal momento del check-in al momento della scansione del bagaglio nel punto di imbarco per il passeggero con numero di biglietto 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)

Spiegazione: nei dati del bagaglio, ogni flightLeg dispone di un array di azioni. Nell'array di azioni sono disponibili tre azioni diverse. Il codice azione per il primo elemento dell'array è Check-in/Offload. Per la prima gamba, il codice azione è Check-in e per le altre gambe, il codice azione è Offload all'hop. Il codice azione per il secondo elemento dell'array è BagTag Scan. Nella query precedente, si determina la differenza di tempo di azione tra la scansione dei tag bag e il tempo di check-in. Utilizzare la funzione contains per filtrare il tempo di azione solo se il codice azione è Check-in o BagScan. Dal momento che solo la prima tappa di volo ha i dettagli del check-in e della scansione delle borse, è inoltre possibile filtrare i dati utilizzando la funzione starts_with per recuperare solo il codice sorgente fltRouteSrc.

Output:

{"flightNo":"BM572","checkinTime":"2019-03-02T03:28:00Z",
"bagScanTime":"2019-03-02T04:52:00Z","diff":-5040000}

Esempio 2: trovare l'elenco dei passeggeri la cui destinazione è JTR.

SELECT fullname FROM baggageInfo $bagInfo
WHERE ends_with($bagInfo.bagInfo[].routing, "JTR")

Output:

{"fullname":"Lucinda Beckman"}
{"fullname":"Gerard Greene"}
{"fullname":"Michelle Payne"}

funzione index_of

La funzione index_of determina la posizione del primo carattere della stringa di ricerca alla sua prima ricorrenza, se presente.

returnvalue index_of(source, search_string [, start_position])

source ::= any*
search_string ::= any*
start_position ::= integer*
returnvalue ::= integer

Vari valori restituiti:

Esempio 1: determinare in quale posizione si trova "-" nell'orario di arrivo stimato della prima tappa per il passeggero con numero di biglietto 1762320569757.

SELECT index_of(bag.baginfo.flightLegs[0].estimatedArrival,"-")
FROM BaggageInfo bag
WHERE ticketNo=1762320569757

Output:

{"Column_1":4}

Esempio 2: determinare in quale posizione si trova "/" nell'instradamento della prima tappa per il passeggero con numero di biglietto 1762320569757. Ciò consente di determinare il numero di caratteri disponibili per il punto di origine del passeggero con il numero di biglietto 1762320569757.

SELECT index_of(bag.baginfo.routing,"/")
FROM BaggageInfo bag
WHERE ticketNo=1762320569757

Output:

"Column_1":3}

funzione di sostituzione

La funzione replace restituisce l'origine con ogni ricorrenza della stringa di ricerca sostituita dalla stringa di sostituzione.

returnvalue replace(source, search_string [, replacement_string])

source ::= any*
search_string ::= any*
replacement_string ::= any*
returnvalue ::= string

Esempio:sostituire la posizione di origine del passeggero con il numero di biglietto 1762320569757 da SFO a SOF.

SELECT replace(bag.bagInfo[0].routing,"SFO","SOF")
FROM baggageInfo bag
WHERE ticketNo=1762320569757

Output:

{"Column_1":"SOF/IST/ATH/JTR"}

Esempio 2:sostituire le virgolette doppie nel nome del passeggero con un unico preventivo.

Se i dati potrebbero contenere una virgoletta doppia nel nome del passeggero, è possibile utilizzare la funzione di sostituzione per modificare la virgoletta doppia in un singolo preventivo.

SELECT fullname,
replace(fullname, """, "'") as new_fullname
FROM BaggageInfo bag

funzione inversa

La funzione reverse restituisce i caratteri della stringa di origine in ordine inverso, dove la stringa viene scritta a partire dall'ultimo carattere.

returnvalue reverse(source)

source ::= any*
returnvalue ::= string

Esempio: visualizzare il nome completo e annullare il nome completo del passeggero con numero di biglietto 1762330498104.

SELECT fullname, reverse(fullname)
FROM baggageInfo
WHERE ticketNo=1762330498104

Output:

{"fullname":"Michelle Payne","Column_2":"enyaP ellehciM"}

Esempi che utilizzano l'API QueryRequest

È possibile utilizzare l'API QueryRequest e applicare le funzioni SQL per recuperare i dati da una tabella NoSQL.

Per eseguire la query, utilizzare l'API NoSQLHandle.query().

Scarica il codice completo SQLFunctions.java dagli esempi qui.

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

Per eseguire la query, utilizzare il metodo borneo.NoSQLHandle.query().

Scarica il codice completo SQLFunctions.py dagli esempi qui.

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

Per eseguire una query, utilizzare la funzione Client.Query.

Scarica il codice completo SQLFunctions.go dagli esempi qui.

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

Per eseguire una query, utilizzare il metodo query.

JavaScript: scarica il codice completo SQLFunctions.js dagli esempi qui.

  //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: scarica il codice completo SQLFunctions.ts dagli esempi qui.

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

Per eseguire una query, è possibile chiamare il metodo QueryAsync o chiamare il metodo GetQueryAsyncEnumerable e ripetere l'enumerazione asincrona risultante.

Scarica il codice completo SQLFunctions.cs dagli esempi qui.

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

Argomenti correlati