Uso de Expresiones Primarias en SQL

Si desea seguir los ejemplos, consulte Datos de ejemplo para ejecutar consultas para ver datos de ejemplo y aprender a utilizar la consola de OCI para crear las tablas de ejemplo y cargar datos mediante archivos JSON.

Expresiones entre paréntesis

Las expresiones entre paréntesis se utilizan principalmente para modificar la prioridad por defecto entre operadores. También se utilizan como una ayuda sintáctica para mezclar expresiones de maneras que de otro modo causarían ambigüedades sintácticas.

Ejemplo: recupere el nombre completo, el número de etiqueta y los detalles de enrutamiento de los pasajeros que abordan en JFK/pasan por JFK y su destino es MAD o 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" )

Explicación: desea recuperar el nombre completo, el número de etiqueta y los detalles de enrutamiento de los pasajeros. La primera condición de filtro es que el punto de embarque/tránsito sea JFK. Una vez que esto se cumple, la segunda condición de filtro es que el destino sea MAD o VIE. Utilice una condición OR para filtrar el valor de destino.

Salida:
{"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"]}

Expresiones Case

La expresión CASE buscada es similar a las sentencias if-then-else de los lenguajes de programación tradicionales. Consta de varios pares WHEN-THEN, seguidos de una cláusula ELSE opcional al final. Cada expresión WHEN es una condición, es decir, debe devolver BOOLEAN. Las expresiones THEN y la expresión ELSE pueden devolver cualquier secuencia de elementos. La expresión CASE se evalúa evaluando primero las expresiones WHEN de arriba abajo hasta la primera que devuelve true. Si la expresión i-th WHEN devuelve true, se evalúa la expresión i-th THEN y su resultado es el resultado de toda la expresión CASE. Si ninguna expresión WHEN devuelve true, si hay un ELSE, se evalúa su expresión y su resultado es el resultado de toda la expresión CASE; de lo contrario, el resultado de la expresión CASE es la secuencia vacía.

Ejemplo:
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

Explicación: desea determinar cuántos tránsitos hay para el pasajero bagInfo mediante una sentencia CASE. Si la matriz flightLegs no tiene elementos, el pasajero no tiene datos de bolsa. Cuando la matriz flightLegs tiene un solo elemento, solo hay un punto de tránsito. Del mismo modo, si la matriz flightLegs tiene dos elementos, hay dos saltos. De lo contrario, hay tres puntos de tránsito. Aquí se asume que una bolsa puede tener como máximo tres puntos de tránsito/talleres.

Salida:
{"fullName":"Mary Watson","NUMBER_HOPS":"you have two hops."}
Ejemplo 2: escriba una consulta para alertar al sistema de que actualice el tagNum de pasajeros si el valor existente no es una cadena.
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 

Explicación: tagNum de los pasajeros en el esquema bagInfo es un tipo de dato STRING. Pero la aplicación podría tener un valor NUMBER como valor de tagNum por error. La consulta utiliza el operador "es de tipo" para capturar esto y solicita al sistema que actualice tagNum si el valor existente no es una cadena.

Salida (solo se muestran pocas filas por brevedad).
{"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"}

Expresión cast

La expresión de conversión crea, si es posible, nuevos elementos de un tipo de destino determinado a partir de los elementos de su secuencia de entrada. Por ejemplo, un STRING se puede convertir a TIMESTAMP(0) mediante la expresión CAST.

Reglas seguidas en una expresión CAST:
  • Si el tipo del elemento de entrada es igual al tipo de elemento de destino, la conversión es no operativa: se devuelve el elemento de entrada en sí.
  • Si el tipo de destino es un tipo de comodín distinto de JSON y el tipo del elemento de entrada es un subtipo del tipo de comodín, la conversión es no operativa.
  • Si el tipo de destino es JSON, se emite un error si el elemento de entrada es un tipo atómico no json.
  • Si el tipo de destino es un tipo de matriz, se genera un error si el elemento de entrada no es una matriz.
  • Si el tipo de destino es cadena, el elemento de entrada puede ser de cualquier tipo. Esto significa que cada elemento se puede convertir en una cadena. Para los registros de hora, su valor de cadena está en UTC y tiene el formato uuuu-MM-dd['T'HH:mm:ss].
  • Si el tipo de destino es un tipo atómico distinto de cadena, el elemento de entrada también debe ser atómico.
      • Los enteros y los largos se pueden convertir en registros de hora. El valor de entrada se interpreta como el número de segundos desde el 1 de enero de 1970, 00:00:00 GMT.
      • Los elementos de cadena pueden ser casuales para todos los demás tipos atómicos. Si la conversión se realiza correctamente o no depende de si el valor de cadena real se puede analizar en un valor que pertenezca al dominio del tipo de destino.
      • Los elementos de registro de hora se pueden poner en cascada en todos los tipos de registro de hora. Si el tipo de destino tiene una precisión menor que el elemento de entrada, el registro de hora resultante es el más cercano al registro de hora de entrada en la precisión de destino.
  • Para convertir un STRING en TIMESTAMP, si la entrada tiene valores STRING en formato ISO-8601, el tiempo de ejecución SQL lo convertirá automáticamente en tipo de dato TIMESTAMP.

    Note:

    ISO8601 describe una forma aceptada internacionalmente de representar fechas, horas y duraciones.

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

    donde
    • AAAA especifica el año, como cuatro dígitos decimales
    • MM especifica el mes, como dos dígitos decimales, de 00 a 12
    • DD especifica el día, como dos dígitos decimales, de 00 a 31
    • hh especifica la hora, como dos dígitos decimales, de 00 a 23
    • mm especifica los minutos, como dos dígitos decimales, de 00 a 59
    • ss[.s[s[s[s[s]]]]] especifica los segundos, como dos dígitos decimales, de 00 a 59, seguido opcionalmente por una coma decimal y de 1 a 6 dígitos decimales (que representan la parte fraccional de un segundo).
    • Z especifica la hora UTC (zona horaria 0). (También se puede especificar por +00:00, pero no por -00:00).
    • (+|-)hh:mm especifica la zona horaria como diferencia de UTC. (Se requiere uno de + o -).
Ejemplo 1: captura de la fecha de llegada de la bolsa para el pasajero con un código de reserva DN3I4Q en formato TIMESTAMP(3).
SELECT CAST (bag.bagInfo.bagArrivalDate AS Timestamp(3))
AS BAG_ARRIVING_DATE 
FROM BaggageInfo bag WHERE bag.confNo=DN3I4Q

Explicación: bagArrivalDate es un STRING. Con CAST está convirtiendo este campo en un formato TIMESTAMP.

Salida:
{"BAG_ARRIVING_DATE":"2019-02-15T21:21:00.000Z"}
Ejemplo 2: recupere el nombre completo y el número de etiqueta de todo el equipaje de cliente enviado después de 2019.
SELECT fullName, bag.ticketNo, 
bag.bagInfo[].bagArrivalDate 
FROM BaggageInfo bag WHERE
exists bag.bagInfo[$element.bagArrivalDate >="2019-01-01T00:00:00"]

Explicación: desea filtrar y mostrar los detalles del equipaje que se envía después de 2019. La fecha de llegada de la bolsa para cada elemento de la matriz flightLegs se compara con el registro de hora determinado (2019-01-01T00:00:00). Aquí la conversión está implícita, ya que bagArrivalDate es un STRING y se compara directamente con un valor de registro de hora estático. No se necesita una función CAST explícita cuando se puede realizar una conversión implícita. Sin embargo, sus datos deben tener el formato YYYY-MM-DDTHH:MI:SS . A continuación, utilice la condición EXISTS para comprobar si bagInfo está presente para esta condición de registro de hora.

Salida:
{"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"}

Expresiones de transformación de secuencia

Una expresión de transformación de secuencia transforma una secuencia en otra. Se parece sintácticamente a una función cuyo nombre es seq_transform. El primer argumento es una expresión que genera la secuencia que se va a transformar (la secuencia de entrada) y el segundo argumento es una expresión "asignador" que se calcula para cada elemento de la secuencia de entrada. El resultado de la expresión seq_transform es la concatenación de secuencias producidas por cada evaluación de la expresión asignadora. La expresión asignadora puede acceder al elemento de entrada actual mediante la variable $.

Ejemplo: para cada ticketNo, recupere una matriz plana que contenga todas las acciones realizadas en el equipaje de ese 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

Explicación: puede utilizar la expresión de transformación de secuencia para transformar documentos JSON almacenados en filas de tabla. En estos casos, a menudo se utilizan varias expresiones de transformación de secuencia anidadas entre sí. Aquí la expresión mapeadora de una transformación de secuencia interna puede necesitar acceder al elemento actual de una transformación de secuencia externa. Para ello, cada expresión de transformación de secuencia 'S' declara una variable con el nombre $sqN, donde N es el nivel de anidamiento de la expresión S dentro de las expresiones de transformación de secuencia externa. $sqN es básicamente un sinónimo de $, es decir, está enlazado a los elementos devueltos por la expresión de entrada S. Sin embargo, otras expresiones de transformación de secuencia que se pueden anidar dentro de la expresión S pueden acceder a $sqN.

Salida:
{ 
 "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"} 
 ]
}

Ejemplos de expresiones SQL con la API QueryRequest

Puede utilizar la API QueryRequest y filtrar datos de una tabla NoSQL mediante expresiones SQL.

Para ejecutar la consulta, utilice la API NoSQLHandle.query().

Descargue el código completo SQLExpressions.java de los ejemplos aquí.
 //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 ejecutar la consulta, utilice el método borneo.NoSQLHandle.query().

Descargue el código completo SQLExpressions.py de los ejemplos aquí.
# 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 ejecutar una consulta, utilice la función Client.Query.

Descargue el código completo SQLExpressions.go de los ejemplos aquí.
 //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 ejecutar una consulta, utilice el método query.

JavaScript: descargue el código completo SQLExpressions.js de los ejemplos aquí.
  //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: descargue el código completo SQLExpressions.ts de los ejemplos aquí.
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 ejecutar una consulta, puede llamar al método QueryAsync o llamar al método GetQueryAsyncEnumerable e iterar sobre el elemento enumerable asíncrono resultante.

Descargue el código completo SQLExpressions.cs de los ejemplos aquí.
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);