Usando Expressões Primárias em SQL

Se quiser seguir os exemplos, consulte Dados de amostra para executar consultas para exibir uma amostra de dados e aprender a usar a console do OCI para criar as tabelas de exemplo e carregar dados usando arquivos JSON.

Tópicos Relacionados

Expressões com Parênteses

As expressões parênteses são usadas principalmente para alterar a precedência padrão entre os operadores. Eles também são usados como uma ajuda sintática para misturar expressões de maneiras que, de outra forma, causariam ambiguidades sintáticas.

Exemplo: Obtenha o nome completo, o número da etiqueta e os detalhes de roteamento dos passageiros que embarcam no JFK / que percorrem o JFK e seu destino seja MAD ou VIE.
SELECT fullName, bag.bagInfo.tagNum, 
bag.bagInfo.routing, 
bag.bagInfo[].flightLegs[].fltRouteDest 
FROM BaggageInfo bag 
WHERE bag.bagInfo.flightLegs[].fltRouteSrc=any "JFK" AND 
(bag.bagInfo[].flightLegs[].fltRouteDest=any "MAD" OR
bag.bagInfo[].flightLegs[].fltRouteDest=any "VIE" )

Explicação: Você deseja extrair o nome completo, o número da etiqueta e os detalhes de roteamento dos passageiros. A primeira condição do filtro é que o ponto de embarque/trânsito seja JFK. Uma vez satisfeito, a segunda condição do filtro é que o destino seja MAD ou VIE. Use uma condição OR para filtrar o valor de destino.

Saída:
{"fullName":"Dierdre Amador","tagNum":"17657806240229","routing":"JFK/MAD","fltRouteDest":"MAD"}
{"fullName":"Rosalia Triplett","tagNum":"17657806215913","routing":"JFK/IST/VIE","fltRouteDest":["IST","VIE"]}
{"fullName":"Kendal Biddle","tagNum":"17657806296887","routing":"JFK/IST/VIE","fltRouteDest":["IST","VIE"]}

Expressões Case

A expressão CASE pesquisada é semelhante às instruções if-then-else das linguagens de programação tradicionais. Ele consiste em vários pares WHEN-THEN, seguidos por uma cláusula ELSE opcional no final. Cada expressão WHEN é uma condição, ou seja, deve retornar BOOLEAN. As expressões THEN e ELSE podem retornar qualquer sequência de itens. A expressão CASE é avaliada primeiro pelas expressões WHEN de cima para baixo até a primeira que retornar verdadeiro. Se for a expressão i-th WHEN que retornar verdadeiro, a expressão i-th THEN será avaliada e seu resultado será o resultado de toda a expressão CASE. Se nenhuma expressão WHEN retornar verdadeiro, se houver um ELSE, sua expressão será avaliada e seu resultado será o resultado de toda a expressão CASE; caso contrário, o resultado da expressão CASE será a sequência vazia.

Exemplo:
SELECT
    fullName,
    CASE
        WHEN NOT exists bag.bagInfo.flightLegs[0]
        THEN "you have no bag info"
        WHEN NOT exists bag.bagInfo.flightLegs[1]
        THEN "you have one hop"
        WHEN NOT exists bag.bagInfo.flightLegs[2]
        THEN "you have two hops."
        ELSE "you have three hops."
    END AS NUMBER_HOPS
FROM BaggageInfo bag WHERE ticketNo=1762340683564

Explicação: Você deseja determinar quantos trânsitos existem para o passageiro bagInfo usando uma instrução CASE. Se o array flightLegs não tiver elementos, o passageiro não terá dados de bagagem. Quando o array flightLegs tiver apenas um elemento, haverá apenas um ponto de trânsito. Da mesma forma, se o array flightLegs tiver dois elementos, haverá dois hops. Além disso, há três pontos de trânsito. Aqui você assume que uma bolsa pode ter no máximo três pontos de trânsito / lúpulo.

Saída:
{"fullName":"Mary Watson","NUMBER_HOPS":"you have two hops."}
Exemplo 2: Escreva uma consulta para alertar o sistema para atualizar o tagNum de passageiros se o valor existente não for uma string.
SELECT bag.bagInfo[].tagNum,
CASE
   WHEN bag.bagInfo[0].tagNum is of type (NUMBER)
   THEN "Tagnumber is not a STRING. Update the data"
   ELSE "Tagnumber has correct datatype"
   END AS tag_NUM_TYPE
FROM BaggageInfo bag 

Explicação: O tagNum dos passageiros no esquema bagInfo é um tipo de dados STRING. Mas o aplicativo pode assumir um valor NUMBER como o valor de tagNum por engano. A consulta usa o operador "é do tipo" para capturar isso e solicita que o sistema atualize o tagNum se o valor existente não for uma string.

Saída (apenas algumas linhas são mostradas para simplificar).
{"tagNum":"17657806240001","tag_NUM_TYPE":"Tagnumber has correct datatype"}
{"tagNum":"17657806224224","tag_NUM_TYPE":"Tagnumber has correct datatype"}
{"tagNum":17657806243578,"tag_NUM_TYPE":"Tagnumber is not a STRING. Update the data"}
{"tagNum":"1765780623244","tag_NUM_TYPE":"Tagnumber has correct datatype"}

Expressão Cast

A expressão de conversão cria, se possível, novos itens de um determinado tipo de destino com base nos itens de sua sequência de entrada. Por exemplo, uma STRING pode ser convertida em TIMESTAMP(0) usando a expressão CAST.

Regras seguidas em uma expressão CAST:
  • Se o tipo do item de entrada for igual ao tipo de item de destino, a conversão será um não-op: o próprio item de entrada será retornado.
  • Se o tipo de destino for um tipo curinga diferente de JSON e o tipo do item de entrada for um subtipo do tipo curinga, a conversão será um no-op.
  • Se o tipo de destino for JSON, um erro será gerado se o item de entrada for um tipo atômico não json.
  • Se o tipo de destino for um tipo de array, será gerado um erro se o item de entrada não for um array.
  • Se o tipo de destino for string, o item de entrada poderá ser de qualquer tipo. Isso significa que cada item pode ser convertido em uma string. Para timestamps, seu valor de string está em UTC e tem o formato uuuu-MM-dd['T'HH:mm:ss].
  • Se o tipo de destino for um tipo atômico diferente da string, o item de entrada também deverá ser atômico.
      • Inteiros e longos podem ser convertidos em timestamps. O valor de entrada é interpretado como o número de milímetros desde 1 de janeiro de 1970, 00:00:00 GMT.
      • Os itens de string podem ser convertidos em todos os outros tipos atômicos. A conversão bem-sucedida ou não depende se o valor real da string pode ser analisado em um valor que pertence ao domínio do tipo de destino.
      • Os itens de timestamp podem ser convertidos em todos os tipos de timestamp. Se o tipo de destino tiver uma precisão menor que o item de entrada, o timestamp resultante será o mais próximo do timestamp de entrada na precisão de destino.
  • Para converter uma STRING em TIMESTAMP, se a entrada tiver valores STRING no formato ISO-8601, ela será convertida automaticamente pelo runtime do SQL no tipo de dados TIMESTAMP.

    Observação:

    ISO8601 descreve uma maneira aceita internacionalmente de representar datas, horas e durações.

    Syntax: Date with time: YYYY-MM-DDThh:mm:ss[.s[s[s[s[s[s]]]]][Z|(+|-)hh:mm]

    em que
    • AAAA especifica o ano, com quatro dígitos decimais
    • MM especifica o mês, como dois dígitos decimais, de 00 a 12
    • DD especifica o dia, como dois dígitos decimais, de 00 a 31
    • hh especifica a hora, como dois dígitos decimais, de 00 a 23
    • mm especifica os minutos, como dois dígitos decimais, de 00 a 59
    • ss[.s[s[s[s]]]] especifica os segundos, como dois dígitos decimais, de 00 a 59, opcionalmente seguido por um ponto decimal e de 1 a 6 dígitos decimais (representando a parte fracional de um segundo).
    • Z especifica o horário UTC (fuso horário 0). (Também pode ser especificado por +00:00, mas não por -00:00.)
    • (+|-)hh:mm especifica o fuso horário como diferença do UTC. (Um de + ou - é obrigatório.)
Exemplo 1: Obter a data de chegada da mala para o passageiro com um código de reserva DN3I4Q no formato TIMESTAMP(3).
SELECT CAST (bag.bagInfo.bagArrivalDate AS Timestamp(3))
AS BAG_ARRIVING_DATE 
FROM BaggageInfo bag WHERE bag.confNo=DN3I4Q

Explicação: O bagArrivalDate é uma STRING. Usando o CAST, você está convertendo esse campo em um formato TIMESTAMP.

Saída:
{"BAG_ARRIVING_DATE":"2019-02-15T21:21:00.000Z"}
Exemplo 2: Obter o nome completo e o número da etiqueta de toda a bagagem do cliente enviada após 2019.
SELECT fullName, bag.ticketNo, 
bag.bagInfo[].bagArrivalDate 
FROM BaggageInfo bag WHERE
exists bag.bagInfo[$element.bagArrivalDate >="2019-01-01T00:00:00"]

Explicação: Você deseja filtrar e exibir detalhes da bagagem enviada após 2019. A data de chegada do repositório para cada elemento no array flightLegs é comparada com o timestamp fornecido (2019-01-01T00:00:00). Aqui a conversão está implícita, pois bagArrivalDate é uma STRING e é diretamente comparada com um valor de Timestamp estático. Uma função CAST explícita não é necessária quando uma conversão implícita pode ser feita. No entanto, seus dados devem estar no formato YYYY-MM-DDTHH:MI:SS . Em seguida, use a condição EXISTS para verificar se o bagInfo está presente para essa condição de timestamp.

Saída:
{"fullName":"Kendal Biddle","ticketNo":1762377974281,"bagArrivalDate":"2019-03-05T12:00:00Z"}
{"fullName":"Lucinda Beckman","ticketNo":1762320569757,"bagArrivalDate":"2019-03-12T15:05:00Z"}
{"fullName":"Adelaide Willard","ticketNo":1762392135540,"bagArrivalDate":"2019-02-15T21:21:00Z"}
{"fullName":"Raymond Griffin","ticketNo":1762399766476,"bagArrivalDate":"2019-02-03T08:09:00Z"}
{"fullName":"Elane Lemons","ticketNo":1762324912391,"bagArrivalDate":"2019-03-15T10:13:00Z"}
{"fullName":"Zina Christenson","ticketNo":1762390789239,"bagArrivalDate":"2019-02-04T10:08:00Z"}
{"fullName":"Zulema Martindale","ticketNo":1762340579411,"bagArrivalDate":"2019-02-25T20:15:00Z"}
{"fullName":"Dierdre Amador","ticketNo":1762376407826,"bagArrivalDate":"2019-03-07T13:51:00Z"}
{"fullName":"Henry Jenkins","ticketNo":176234463813,"bagArrivalDate":"2019-03-02T13:18:00Z"}
{"fullName":"Rosalia Triplett","ticketNo":1762311547917,"bagArrivalDate":"2019-02-12T07:04:00Z"}
{"fullName":"Lorenzo Phil","ticketNo":1762320369957,"bagArrivalDate":["2019-03-12T15:05:00Z","2019-03-12T16:25:00Z"]}
{"fullName":"Gerard Greene","ticketNo":1762341772625,"bagArrivalDate":"2019-03-07T16:01:00Z"}
{"fullName":"Adam Phillips","ticketNo":1762344493810,"bagArrivalDate":"2019-02-01T16:13:00Z"}
{"fullName":"Doris Martin","ticketNo":1762355527825,"bagArrivalDate":"2019-03-22T10:17:00Z"}
{"fullName":"Joanne Diaz","ticketNo":1762383911861,"bagArrivalDate":"2019-02-16T16:13:00Z"}
{"fullName":"Teena Colley","ticketNo":1762357254392,"bagArrivalDate":"2019-02-13T11:15:00Z"}
{"fullName":"Michelle Payne","ticketNo":1762330498104,"bagArrivalDate":"2019-02-02T23:59:00Z"}
{"fullName":"Mary Watson","ticketNo":1762340683564,"bagArrivalDate":"2019-03-14T06:22:00Z"}
{"fullName":"Omar Harvey","ticketNo":1762348904343,"bagArrivalDate":"2019-03-02T16:09:00Z"}
{"fullName":"Fallon Clements","ticketNo":1762350390409,"bagArrivalDate":"2019-02-21T14:08:00Z"}
{"fullName":"Lisbeth Wampler","ticketNo":1762355854464,"bagArrivalDate":"2019-02-10T10:01:00Z"}

Expressões de Transformação de Sequência

Uma expressão de transformação de sequência transforma uma sequência em outra. Sintaticamente, parece uma função cujo nome é seq_transform. O primeiro argumento é uma expressão que gera a sequência a ser transformada (a sequência de entrada) e o segundo argumento é uma expressão "mapeadora" que é calculada para cada item da sequência de entrada. O resultado da expressão seq_transform é a concatenação de sequências produzidas por cada avaliação da expressão do mapeador. A expressão do mapeador pode acessar o item de entrada atual por meio da variável $.

Exemplo: Para cada ticketNo, extraia um array plano contendo todas as ações executadas na bagagem desse ticketNo.
SELECT seq_transform(l.bagInfo[],
      seq_transform(
          $sq1.flightLegs[],
          seq_transform(
              $sq2.actions[],
              {
                "at" : $sq3.actionAt,
                "action" : $sq3.actionCode,
                "flightNo" : $sq2.flightNo,
                "tagNum" : $sq1.tagNum
              }
          )
      )
  ) AS actions
FROM baggageInfo l WHERE ticketNo=1762340683564

Explicação: Você pode usar a expressão de transformação de sequência para transformar documentos JSON armazenados em linhas de tabela. Nesses casos, geralmente você usa várias expressões de transformação de sequência aninhadas entre si. Aqui a expressão mapeadora de uma transformação de sequência interna pode precisar acessar o item atual de uma transformação de sequência externa. Para permitir isso, cada expressão de transformação de sequência 'S' declara uma variável com o nome $sqN, em que N é o nível de aninhamento da expressão S dentro das expressões de transformação de sequência externa. $sqN é basicamente um sinônimo para $, ou seja, é vinculado aos itens retornados pela expressão de entrada S. No entanto, $sqN pode ser acessado por outras expressões de transformação de sequência que podem ser aninhadas dentro da expressão S.

Saída:
{ 
 "actions":[ 
   {"action":"ONLOAD to HKG","at":"YYZ","flightNo":"BM267","tagNum":"17657806299833"},
   {"action":"BagTag Scan at YYZ","at":"YYZ","flightNo":"BM267","tagNum":"17657806299833"},
   {"action":"Checkin at YYZ","at":"YYZ","flightNo":"BM267","tagNum":"17657806299833"},
   {"action":"Offload to Carousel at BLR","at":"BLR","flightNo":"BM115","tagNum":"17657806299833"},
   {"action":"ONLOAD to BLR","at":"HKG","flightNo":"BM115","tagNum":"17657806299833"},
   {"action":"OFFLOAD from HKG","at":"HKG","flightNo":"BM115","tagNum":"17657806299833"} 
 ]
}

Exemplos de Expressão SQL usando a API QueryRequest

Você pode usar a API QueryRequest e filtrar dados de uma tabela NoSQL usando Expressões SQL.

Para executar sua consulta, use a API NoSQLHandle.query().

Faça download do código completo SQLExpressions.java nos exemplos aqui.
 //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 paran_expr="SELECT fullName, bag.bagInfo.tagNum, bag.bagInfo.routing, "+
"bag.bagInfo[].flightLegs[].fltRouteDest FROM BaggageInfo bag WHERE "+
"bag.bagInfo.flightLegs[].fltRouteSrc=any \"SFO\" AND "+
"(bag.bagInfo[].flightLegs[].fltRouteDest=any \"ATH\" OR "+
"bag.bagInfo[].flightLegs[].fltRouteDest=any \"JTR\" )";
System.out.println("Using Paranthesized expression ");
fetchRows(handle,paran_expr);

String case_expr="SELECT fullName,"+
         "CASE WHEN NOT exists bag.bagInfo.flightLegs[0] "+
        "THEN \"you have no bag info\" "+
        "WHEN NOT exists bag.bagInfo.flightLegs[1] "+
        "THEN \"you have one hop\" "+
        "WHEN NOT exists bag.bagInfo.flightLegs[2] "+
        "THEN \"you have two hops.\" "+
        "ELSE \"you have three hops.\" "+
        "END AS NUMBER_HOPS "+
"FROM BaggageInfo bag WHERE ticketNo=1762341772625";
System.out.println("Using Case Expression ");
fetchRows(handle,case_expr);

String seq_trn_expr="SELECT seq_transform(l.bagInfo[],"+
                              "seq_transform("+
                                "$sq1.flightLegs[],"+
                                "seq_transform("+
                                  "$sq2.actions[],"+
                                  "{"+
                                   "\"at\" : $sq3.actionAt,"+
                                   "\"action\" : $sq3.actionCode,"+
                                   "\"flightNo\" : $sq2.flightNo,"+
                                   "\"tagNum\" : $sq1.tagNum"+
                                  "}"+
                               ")"+
                              ")"+
                           ") AS actions FROM baggageInfo l WHERE ticketNo=1762376407826";
System.out.println("Using Sequence Transform Expressions ");
fetchRows(handle,seq_trn_expr);

Para executar sua consulta, use o método borneo.NoSQLHandle.query().

Faça download do código completo SQLExpressions.py nos exemplos aqui.
# 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))  
paran_expr = '''SELECT fullName, bag.bagInfo.tagNum, bag.bagInfo.routing,
                   bag.bagInfo[].flightLegs[].fltRouteDest FROM BaggageInfo bag
                   WHERE bag.bagInfo.flightLegs[].fltRouteSrc=any "SFO" AND
                   (bag.bagInfo[].flightLegs[].fltRouteDest=any "ATH" OR
                   bag.bagInfo[].flightLegs[].fltRouteDest=any "JTR" )'''
print('Using Paranthesized expression:')
fetch_data(handle,paran_expr)

case_expr = '''SELECT fullName,
    CASE
        WHEN NOT exists bag.bagInfo.flightLegs[0]
        THEN "you have no bag info"
        WHEN NOT exists bag.bagInfo.flightLegs[1]
        THEN "you have one hop"
        WHEN NOT exists bag.bagInfo.flightLegs[2]
        THEN "you have two hops."
        ELSE "you have three hops."
    END AS NUMBER_HOPS
    FROM BaggageInfo bag WHERE ticketNo=1762341772625'''
print('Using Case Expression:')
fetch_data(handle,case_expr)

seq_trn_expr = '''SELECT seq_transform(l.bagInfo[],
                     seq_transform(
                       $sq1.flightLegs[],
                         seq_transform(
                           $sq2.actions[],
                            {
                              "at" : $sq3.actionAt,
                              "action" : $sq3.actionCode,
                              "flightNo" : $sq2.flightNo,
                              "tagNum" : $sq1.tagNum
                            }
                        )
                    )
                ) AS actions FROM baggageInfo l WHERE ticketNo=1762376407826'''
print('Using Sequence Transform Expressions:')
fetch_data(handle,seq_trn_expr)

Para executar uma consulta, use a função Client.Query.

Faça download do código completo SQLExpressions.go nos exemplos aqui.
 //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()))
   }
} 
paran_expr := `SELECT fullName, bag.bagInfo.tagNum, bag.bagInfo.routing,
                    bag.bagInfo[].flightLegs[].fltRouteDest FROM BaggageInfo bag
                    WHERE bag.bagInfo.flightLegs[].fltRouteSrc=any "SFO" AND
                    (bag.bagInfo[].flightLegs[].fltRouteDest=any "ATH" OR
                    bag.bagInfo[].flightLegs[].fltRouteDest=any "JTR" )`
fmt.Printf("Using Paranthesized expression:\n")
fetchData(client, err,tableName,paran_expr)

case_expr := `SELECT fullName,
                 CASE
         			WHEN NOT exists bag.bagInfo.flightLegs[0]
         			THEN "you have no bag info"
         			WHEN NOT exists bag.bagInfo.flightLegs[1]
         			THEN "you have one hop"
         			WHEN NOT exists bag.bagInfo.flightLegs[2]
         			THEN "you have two hops."
         			ELSE "you have three hops."
     				END AS NUMBER_HOPS
     				FROM BaggageInfo bag WHERE ticketNo=1762341772625`
fmt.Printf("Using Case Expression:\n")
fetchData(client, err,tableName,case_expr)

seq_trn_expr := `SELECT seq_transform(l.bagInfo[],
                      seq_transform(
                        $sq1.flightLegs[],
                          seq_transform(
                            $sq2.actions[],
                             {
                               "at" : $sq3.actionAt,
                               "action" : $sq3.actionCode,
                               "flightNo" : $sq2.flightNo,
                               "tagNum" : $sq1.tagNum
                             }
                         )
                     )
                 ) AS actions FROM baggageInfo l WHERE ticketNo=1762376407826`
fmt.Printf("Using Sequence Transform Expressions:\n")
fetchData(client, err,tableName,seq_trn_expr)

Para executar uma consulta, use o método query.

JavaScript: Faça download do código completo SQLExpressions.js nos exemplos aqui.
  //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: Faça download do código completo SQLExpressions.ts nos exemplos aqui.
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 paran_expr = `SELECT fullName, bag.bagInfo.tagNum, bag.bagInfo.routing,
                    bag.bagInfo[].flightLegs[].fltRouteDest FROM BaggageInfo bag
                    WHERE bag.bagInfo.flightLegs[].fltRouteSrc=any "SFO" AND
                    (bag.bagInfo[].flightLegs[].fltRouteDest=any "ATH" OR
                    bag.bagInfo[].flightLegs[].fltRouteDest=any "JTR" )`
console.log("Using Paranthesized expression");
await fetchData(handle,paran_expr);

const case_expr = `SELECT fullName,
                  CASE
                    WHEN NOT exists bag.bagInfo.flightLegs[0]
                    THEN "you have no bag info"
                    WHEN NOT exists bag.bagInfo.flightLegs[1]
                    THEN "you have one hop"
                    WHEN NOT exists bag.bagInfo.flightLegs[2]
                    THEN "you have two hops."
                    ELSE "you have three hops."
                  END AS NUMBER_HOPS
                  FROM BaggageInfo bag WHERE ticketNo=1762341772625`
console.log("Using Case Expression");
await fetchData(handle,case_expr);

const seq_trn_expr = `SELECT seq_transform(l.bagInfo[],
                      seq_transform(
                        $sq1.flightLegs[],
                        seq_transform(
                          $sq2.actions[],
                          {
                            "at" : $sq3.actionAt,
                            "action" : $sq3.actionCode,
                            "flightNo" : $sq2.flightNo,
                            "tagNum" : $sq1.tagNum
                          }
                      )
                  )
                ) AS actions FROM baggageInfo l WHERE ticketNo=1762376407826`
console.log("Using Sequence Transform Expressions");
await fetchData(handle,seq_trn_expr);

Para executar uma consulta, você pode chamar o método QueryAsync ou chamar o método GetQueryAsyncEnumerable e iterar sobre o enumerável assíncrono resultante.

Faça download do código completo SQLExpressions.cs nos exemplos aqui.
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 paran_expr =@"SELECT fullName, bag.bagInfo.tagNum, bag.bagInfo.routing,
                                         bag.bagInfo[].flightLegs[].fltRouteDest FROM BaggageInfo bag
                                         WHERE bag.bagInfo.flightLegs[].fltRouteSrc=any ""SFO"" AND
                                         (bag.bagInfo[].flightLegs[].fltRouteDest=any ""ATH"" OR
                                         bag.bagInfo[].flightLegs[].fltRouteDest=any ""JTR"" )";
Console.WriteLine("\nUsing Paranthesized expression:!");
await fetchData(client,paran_expr);

private const string case_expr =@"SELECT fullName,
                                        CASE
                                          WHEN NOT exists bag.bagInfo.flightLegs[0]
                                          THEN ""you have no bag info""
                                          WHEN NOT exists bag.bagInfo.flightLegs[1]
                                          THEN ""you have one hop""
                                          WHEN NOT exists bag.bagInfo.flightLegs[2]
                                          THEN ""you have two hops.""
                                          ELSE ""you have three hops.""
                                       END AS NUMBER_HOPS
                                       FROM BaggageInfo bag WHERE ticketNo=1762341772625";
Console.WriteLine("\nUsing Case Expression!");
await fetchData(client,case_expr);

private const string seq_trn_expr =@"SELECT seq_transform(l.bagInfo[],
                                           seq_transform(
                                             $sq1.flightLegs[],
                                             seq_transform(
                                                $sq2.actions[],
                                                {
                                                   ""at"" : $sq3.actionAt,
                                                   ""action"" : $sq3.actionCode,
                                                   ""flightNo"" : $sq2.flightNo,
                                                   ""tagNum"" : $sq1.tagNum
                                                }
                                               )
                                             )
                                           ) AS actions FROM baggageInfo l WHERE ticketNo=1762376407826" ;
Console.WriteLine("\nUsing Sequence Transform Expressions!");
await fetchData(client,seq_trn_expr);