Utilisation d'expressions principales en SQL

Si vous voulez suivre les exemples, reportez-vous à Exemples de données pour exécuter des requêtes afin de visualiser un exemple de données et d'apprendre à utiliser la console OCI pour créer les exemples de tables et charger des données à l'aide de fichiers JSON.

Expressions entre parenthèses

Les expressions entre parenthèses sont principalement utilisées pour modifier la priorité par défaut des opérateurs. Ils sont également utilisés comme une aide syntaxique pour mélanger des expressions de manière à provoquer des ambiguïtés syntaxiques.

Exemple : Extrayez le nom complet, le numéro d'étiquette et les détails d'itinéraire des passagers qui embarquent à bord de JFK ou traversent JFK et dont la destination est 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" )

Explication : vous souhaitez extraire le nom complet, le numéro de balise et les détails d'acheminement des passagers. La première condition de filtre est que le point d'embarquement/transit est JFK. Une fois que cela est satisfait, la deuxième condition de filtre est que la destination soit MAD ou VIE. Vous utilisez une condition OR pour filtrer la valeur de destination.

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

Expressions Case

L'expression CASE recherchée est similaire aux instructions if-then-else des langages de programmation traditionnels. Il se compose d'un certain nombre de paires WHEN-THEN, suivies d'une clause ELSE facultative à la fin. Chaque expression WHEN est une condition, c'est-à-dire qu'elle doit renvoyer BOOLEAN. Les expressions THEN et ELSE peuvent renvoyer n'importe quelle séquence d'éléments. L'expression CASE est évaluée en évaluant d'abord les expressions WHEN de haut en bas jusqu'à la première expression qui renvoie true. Si c'est l'expression i-th WHEN qui renvoie true, alors l'expression i-th THEN est évaluée et son résultat est le résultat de toute l'expression CASE. Si aucune expression WHEN ne renvoie la valeur True, s'il existe une expression ELSE, son expression est évaluée et son résultat est le résultat de l'ensemble de l'expression CASE ; sinon, le résultat de l'expression CASE est la séquence vide.

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

Explication : Vous souhaitez déterminer le nombre de transits présents pour le passager bagInfo à l'aide d'une instruction CASE. Si le tableau flightLegs ne contient aucun élément, le passager n'a pas de données de conteneur. Lorsque le tableau flightLegs ne comporte qu'un seul élément, il n'y a qu'un seul point de transit. De même, si le tableau flightLegs comporte deux éléments, il y a deux sauts. Sinon, il y a trois points de transit. Ici, vous supposez qu'un sac peut avoir au plus trois points de transit / arrêts.

Sortie :
{"fullName":"Mary Watson","NUMBER_HOPS":"you have two hops."}
Exemple 2 : écrivez une requête pour alerter le système de la mise à jour de tagNum des passagers si la valeur existante n'est pas une chaîne.
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 

Explication : Le tagNum des passagers dans le schéma bagInfo est un type de données STRING. Mais l'application peut prendre une valeur NUMBER comme valeur de tagNum par erreur. La requête utilise l'opérateur "est de type" pour la capturer et invite le système à mettre à jour tagNum si la valeur existante n'est pas une chaîne.

Sortie (seules quelques lignes sont affichées pour des raisons de concision).
{"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"}

Cast Expression

L'expression de conversion crée, si possible, de nouveaux éléments d'un type de cible donné à partir des éléments de sa séquence d'entrée. Par exemple, un STRING peut être converti en TIMESTAMP(0) à l'aide de l'expression CAST.

Règles suivies dans une expression CAST :
  • Si le type de l'élément d'entrée est égal au type d'élément cible, la conversion est une opération no-op : l'élément d'entrée lui-même est renvoyé.
  • Si le type de cible est un type générique autre que JSON et que le type de l'élément d'entrée est un sous-type du type de caractère générique, la conversion est une opération no-op.
  • Si le type de cible est JSON, une erreur est générée si l'élément d'entrée est un type atomique non json.
  • Si le type de cible est un tableau, une erreur est générée si l'élément d'entrée n'est pas un tableau.
  • Si le type de cible est chaîne, l'élément d'entrée peut être de tout type. Cela signifie que chaque élément peut être converti en chaîne. Pour les horodatages, leur valeur de chaîne est au format UTC et au format uuuu-MM-dd['T'HH:mm:ss].
  • Si le type de cible est un type atomique autre que chaîne, l'élément d'entrée doit également être atomique.
      • Les entiers et les longs peuvent être convertis en horodatages. La valeur d'entrée est interprétée comme le nombre de millisecondes depuis le 1er janvier 1970, 00:00:00 GMT.
      • Les éléments de chaîne peuvent être convertis vers tous les autres types atomiques. La réussite ou l'échec de la conversion dépend de la possibilité d'analyser la valeur de chaîne réelle en une valeur appartenant au domaine du type cible.
      • Les éléments d'horodatage peuvent être convertis vers tous les types d'horodatage. Si le type de cible a une précision inférieure à celle de l'élément d'entrée, l'horodatage obtenu est celui le plus proche de l'horodatage d'entrée dans la précision cible.
  • Pour convertir un STRING en TIMESTAMP, si l'entrée a des valeurs STRING au format ISO-8601, elle sera automatiquement convertie par l'exécution SQL en type de données TIMESTAMP.

    Remarques :

    ISO8601 décrit un moyen internationalement accepté de représenter des dates, des heures et des durées.

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

    où :
    • YYYY spécifie l'année sous forme de quatre chiffres décimaux
    • MM spécifie le mois, sous forme de deux chiffres décimaux, de 00 à 12
    • DD spécifie le jour, sous forme de deux chiffres décimaux, de 00 à 31
    • hh spécifie l'heure, sous forme de deux décimales, 00 à 23
    • mm spécifie les minutes, sous forme de deux chiffres décimaux, de 00 à 59
    • ss[.s[s[s[s[s]]]]] spécifie les secondes, sous la forme de deux chiffres décimaux, de 00 à 59, éventuellement suivis d'une virgule et de 1 à 6 chiffres décimaux (représentant la partie fractionnaire d'une seconde).
    • Z indique l'heure UTC (fuseau horaire 0). (Il peut également être spécifié par +00:00, mais pas par -00:00.)
    • (+|-)hh:mm spécifie le fuseau horaire comme différence par rapport à UTC. (L'une des valeurs + ou - est requise.)
Exemple 1 : Extrayez la date d'arrivée du sac pour le passager avec le code de réservation DN3I4Q au format TIMESTAMP(3).
SELECT CAST (bag.bagInfo.bagArrivalDate AS Timestamp(3))
AS BAG_ARRIVING_DATE 
FROM BaggageInfo bag WHERE bag.confNo=DN3I4Q

Explication : bagArrivalDate est un STRING. A l'aide de CAST, vous convertissez ce champ au format TIMESTAMP.

Sortie :
{"BAG_ARRIVING_DATE":"2019-02-15T21:21:00.000Z"}
Exemple 2 : Extrayez le nom complet et le numéro d'étiquette de tous les bagages client expédiés après 2019.
SELECT fullName, bag.ticketNo, 
bag.bagInfo[].bagArrivalDate 
FROM BaggageInfo bag WHERE
exists bag.bagInfo[$element.bagArrivalDate >="2019-01-01T00:00:00"]

Explication : Vous souhaitez filtrer et afficher les détails des bagages expédiés après 2019. La date d'arrivée du conteneur pour chaque élément du tableau flightLegs est comparée à l'horodatage indiqué (2019-01-01T00:00:00). Ici, la conversion est implicite car bagArrivalDate est un STRING et est directement comparé à une valeur d'horodatage statique. Une fonction CAST explicite n'est pas nécessaire lorsqu'une conversion implicite peut être effectuée. Toutefois, vos données doivent être au format YYYY-MM-DDTHH:MI:SS . Utilisez ensuite la condition EXISTS pour vérifier si bagInfo est présent pour cette condition d'horodatage.

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

Expressions de transformation de séquence

Une expression de transformation de séquence transforme une séquence en une autre séquence. Syntactiquement, il ressemble à une fonction dont le nom est seq_transform. Le premier argument est une expression qui génère la séquence à transformer (la séquence d'entrée) et le second argument est une expression "mapper" qui est calculée pour chaque élément de la séquence d'entrée. Le résultat de l'expression seq_transform est la concaténation des séquences produites par chaque évaluation de l'expression de mapping. L'expression de mapping peut accéder à l'élément d'entrée actuel via la variable $.

Exemple : pour chaque élément ticketNo, extrayez un tableau plat contenant toutes les actions effectuées sur le bagage de cet élément 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

Explication : Vous pouvez utiliser l'expression de transformation de séquence pour transformer des documents JSON stockés dans des lignes de table. Dans ce cas, vous utilisez souvent plusieurs expressions de transformation de séquence imbriquées les unes dans les autres. Ici, l'expression de mise en correspondance d'une transformation de séquence interne peut avoir besoin d'accéder à l'élément courant d'une transformation de séquence externe. Pour ce faire, chaque expression de transformation de séquence "S" déclare une variable portant le nom $sqN, où N est le niveau d'imbrication de l'expression S dans les expressions de transformation de séquence externe. $sqN est essentiellement un synonyme de $, c'est-à-dire qu'il est lié aux éléments renvoyés par l'expression d'entrée S. Cependant, $sqN est accessible par d'autres expressions de transformation de séquence qui peuvent être imbriquées dans l'expression S.

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

Exemples d'expression SQL utilisant l'API QueryRequest

Vous pouvez utiliser l'API QueryRequest et filtrer les données d'une table NoSQL à l'aide d'expressions SQL.

Pour exécuter la requête, utilisez l'API NoSQLHandle.query().

Téléchargez le code complet SQLExpressions.java à partir des exemples ici.
 //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);

Pour exécuter votre requête, utilisez la méthode borneo.NoSQLHandle.query().

Téléchargez le code complet SQLExpressions.py à partir des exemples ici.
# 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)

Pour exécuter une requête, utilisez la fonction Client.Query.

Téléchargez le code complet SQLExpressions.go à partir des exemples ici.
 //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)

Pour exécuter une requête, utilisez la méthode query.

JavaScript : téléchargez le code complet SQLExpressions.js à partir des exemples ici.
  //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 : téléchargez le code complet SQLExpressions.ts à partir des exemples ici.
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);

Pour exécuter une requête, vous pouvez appeler la méthode QueryAsync ou appeler la méthode GetQueryAsyncEnumerable et effectuer une itération sur l'énumérable asynchrone résultant.

Téléchargez le code complet SQLExpressions.cs à partir des exemples ici.
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);