

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Commandes SQL et PPL prises en charge
<a name="direct-query-supported-commands"></a>

OpenSearch SQL et OpenSearch Pipeline Processing Language (PPL) sont des langages permettant d'interroger, d'analyser et de traiter des données dans OpenSearch CloudWatch Logs Insights et Security Lake. Vous pouvez utiliser OpenSearch SQL et OpenSearch PPL dans OpenSearch Discover pour interroger des données dans CloudWatch Logs, Amazon S3 ou Security Lake. CloudWatch Logs Insights prend également en charge les langages de requête OpenSearch PPL et OpenSearch SQL, en plus de Logs Insights QL, un langage de requête spécialement conçu pour analyser les journaux. CloudWatch 
+ **OpenSearch SQL** : OpenSearch SQL fournit une option familière si vous avez l'habitude de travailler avec des bases de données relationnelles. OpenSearch SQL offre un sous-ensemble de fonctionnalités SQL, ce qui en fait un bon choix pour effectuer des requêtes ad hoc et des tâches d'analyse de données. Avec OpenSearch SQL, vous pouvez utiliser des commandes telles que SELECT, FROM, WHERE, GROUP BY, HAVING, ainsi que diverses autres commandes et fonctions SQL disponibles dans SQL. Vous pouvez exécuter des tâches JOINs entre des tables (ou des groupes de journaux), corréler des données entre des tables (ou des groupes de journaux) à l'aide de sous-requêtes et utiliser le riche ensemble de fonctions JSON, mathématiques, de chaîne, conditionnelles et autres fonctions SQL pour effectuer une analyse approfondie des données de journal et de sécurité.
+ **OpenSearch PPL (Piped Processing Language) :** avec OpenSearch PPL, vous pouvez récupérer, interroger et analyser des données à l'aide de commandes groupées, ce qui facilite la compréhension et la composition de requêtes complexes. Sa syntaxe est basée sur les canaux Unix et permet d'enchaîner les commandes pour transformer et traiter les données. Avec PPL, vous pouvez filtrer et agréger des données, et utiliser des commandes telles que des sous-requêtes JOINs, LOOKUP, ainsi qu'un ensemble complet de fonctions mathématiques, de chaîne, de date, conditionnelles et autres à des fins d'analyse.

Bien que la plupart des commandes des langages de requête OpenSearch PPL et OpenSearch SQL soient communes à CloudWatch Logs OpenSearch, il existe des différences dans les ensembles de commandes et de fonctions pris en charge dans chacun de ces services. Pour plus de détails, consultez les tableaux des pages suivantes. 

****
+ [Commandes et fonctions OpenSearch SQL prises en charge](supported-directquery-sql.md)
  + [Informations supplémentaires pour les utilisateurs de CloudWatch Logs Insights utilisant OpenSearch SQL](supported-directquery-sql.md#supported-sql-for-multi-log-queries)
  + [Restrictions SQL générales](supported-directquery-sql.md#general-sql-restrictions)
+ [Commandes PPL prises en charge](supported-ppl.md)
  + [Informations supplémentaires pour les utilisateurs de CloudWatch Logs Insights utilisant OpenSearch PPL](supported-ppl.md#supported-ppl-for-cloudwatch-users)

# Commandes et fonctions OpenSearch SQL prises en charge
<a name="supported-directquery-sql"></a>

Les tableaux de référence suivants indiquent quelles commandes SQL sont prises en charge dans OpenSearch Discover pour interroger des données dans Amazon S3, Security Lake ou CloudWatch Logs, et quelles commandes SQL sont prises en charge dans CloudWatch Logs Insights. La syntaxe SQL prise en charge dans CloudWatch Logs Insights et celle prise en charge dans OpenSearch Discover pour interroger les CloudWatch journaux sont identiques et référencées sous le nom de CloudWatch journaux dans les tableaux suivants.

**Note**  
OpenSearch dispose également d'un support SQL pour interroger les données ingérées OpenSearch et stockées dans des index. Ce dialecte SQL est différent du SQL utilisé dans les requêtes directes et est appelé [OpenSearch SQL sur les index](https://opensearch.org/docs/latest/search-plugins/sql/sql/index/).

**Topics**
+ [Commandes](#supported-sql-data-retrieval)
+ [Fonctions](#supported-sql-functions)
+ [Restrictions SQL générales](#general-sql-restrictions)
+ [Informations supplémentaires pour les utilisateurs de CloudWatch Logs Insights utilisant OpenSearch SQL](#supported-sql-for-multi-log-queries)

## Commandes
<a name="supported-sql-data-retrieval"></a>

**Note**  
Dans la colonne des exemples de commandes, remplacez le cas `<tableName/logGroup>` échéant en fonction de la source de données que vous interrogez.   
Exemple de commande : `SELECT Body , Operation FROM <tableName/logGroup>` 
Si vous interrogez Amazon S3 ou Security Lake, utilisez : `SELECT Body , Operation FROM table_name` 
Si vous interrogez CloudWatch Logs, utilisez : `SELECT Body , Operation FROM `LogGroupA`` 


| Commande | Description | CloudWatch Journaux | Amazon S3 | Security Lake | Exemple de commande  | 
| --- | --- | --- | --- | --- | --- | 
|  [Clause SELECT](#supported-sql-select)  |  Affiche les valeurs projetées.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    method,<br />    status <br />FROM <br />    <tableName/logGroup></pre>  | 
| [Clause WHERE](#supported-sql-where) |  Les filtres enregistrent les événements en fonction des critères de champ fournis.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    * <br />FROM <br />    <tableName/logGroup><br />WHERE <br />    status = 100</pre>  | 
| [Clause GROUP BY](#supported-sql-group-by) |  Les groupes enregistrent les événements par catégorie et trouvent la moyenne en fonction des statistiques.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    method,<br />    status,<br />    COUNT(*) AS request_count,<br />    SUM(bytes) AS total_bytes <br />FROM <br />    <tableName/logGroup> <br />GROUP BY <br />    method, <br />    status</pre>  | 
| [Clause HAVING](#supported-sql-having) |  Filtre les résultats en fonction des conditions de regroupement.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    method,<br />    status,<br />    COUNT(*) AS request_count,<br />    SUM(bytes) AS total_bytes <br />FROM <br />    <tableName/logGroup> <br />GROUP BY <br />    method,<br />    status<br />HAVING <br />    COUNT(*) > 5</pre>  | 
| [Clause ORDER BY](#supported-sql-order-by) |  Trie les résultats en fonction des champs de la clause de commande. Vous pouvez trier par ordre décroissant ou croissant.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    * <br />FROM <br />    <tableName/logGroup> <br />ORDER BY <br />    status DESC</pre>  | 
|  [Clause JOIN](#supported-sql-join)  ( `INNER` \$1 `CROSS` \$1 `LEFT` `OUTER` )  |  Joint les résultats de deux tables sur la base de champs communs.  |  ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Supporté (doit utiliser `Inner` des `Left Outer` mots clés pour la jointure ; une seule opération JOIN est prise en charge dans une instruction SELECT)  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Supporté (vous devez utiliser les mots clés Inner, Left Outer et Cross pour la jointure) | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Supporté (vous devez utiliser les mots clés Inner, Left Outer et Cross pour la jointure) |  <pre>SELECT <br />    A.Body,<br />    B.Timestamp<br />FROM <br />    <tableNameA/logGroupA> AS A <br />INNER JOIN <br />    <tableNameB/logGroupB> AS B <br />    ON A.`requestId` = B.`requestId`</pre>  | 
| [Clause LIMIT](#supported-sql-limit) |  Limite les résultats aux N premières lignes.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    * <br />FROM <br />    <tableName/logGroup> <br />LIMIT <br />    10</pre>  | 
| [Clause CASE](#supported-sql-case) | Évalue les conditions et renvoie une valeur lorsque la première condition est remplie. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT<br />    method,<br />    status,<br />    CASE<br />        WHEN status BETWEEN 100 AND 199 THEN 'Informational'<br />        WHEN status BETWEEN 200 AND 299 THEN 'Success'<br />        WHEN status BETWEEN 300 AND 399 THEN 'Redirection'<br />        WHEN status BETWEEN 400 AND 499 THEN 'Client Error'<br />        WHEN status BETWEEN 500 AND 599 THEN 'Server Error'<br />        ELSE 'Unknown Status'<br />    END AS status_category,<br />    CASE method<br />        WHEN 'GET' THEN 'Read Operation'<br />        WHEN 'POST' THEN 'Create Operation'<br />        WHEN 'PUT' THEN 'Update Operation'<br />        WHEN 'PATCH' THEN 'Partial Update Operation'<br />        WHEN 'DELETE' THEN 'Delete Operation'<br />        ELSE 'Other Operation'<br />    END AS operation_type,<br />    bytes,<br />    datetime<br />FROM <tableName/logGroup>                         </pre>  | 
| [Expression de table commune](#supported-sql-cte) | Crée un jeu de résultats temporaire nommé dans une instruction SELECT, INSERT, UPDATE, DELETE ou MERGE. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>WITH RequestStats AS (<br />    SELECT <br />        method,<br />        status,<br />        bytes,<br />        COUNT(*) AS request_count<br />    FROM <br />        tableName<br />    GROUP BY <br />        method,<br />        status,<br />        bytes<br />)<br />SELECT <br />    method,<br />    status,<br />    bytes,<br />    request_count <br />FROM <br />    RequestStats <br />WHERE <br />    bytes > 1000</pre>  | 
| [EXPLAIN](#supported-sql-explain) | Affiche le plan d'exécution d'une instruction SQL sans l'exécuter réellement. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>EXPLAIN<br />SELECT <br />    k,<br />    SUM(v)<br />FROM <br />    VALUES <br />        (1, 2),<br />        (1, 3) AS t(k, v)<br />GROUP BY <br />    k</pre>  | 
| [Clause LATERAL SUBQUERY](#supported-sql-lateral-subquery) | Permet à une sous-requête de la clause FROM de référencer les colonnes des éléments précédents de la même clause FROM. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> SELECT <br />    * <br />FROM <br />    tableName<br />LATERAL (<br />    SELECT <br />        * <br />    FROM <br />        t2 <br />    WHERE <br />        t1.c1 = t2.c1<br />)</pre>  | 
| [Clause de vue latérale](#supported-sql-lateral-view) | Génère une table virtuelle en appliquant une fonction de génération de table à chaque ligne d'une table de base. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    * <br />FROM <br />    tableName<br />LATERAL VIEW <br />    EXPLODE(ARRAY(30, 60)) tableName AS c_age<br />LATERAL VIEW <br />    EXPLODE(ARRAY(40, 80)) AS d_age</pre>  | 
| [Prédicat LIKE](#supported-sql-like-predicate) | Fait correspondre une chaîne à un modèle à l'aide de caractères génériques. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> SELECT <br />    method,<br />    status,<br />    request,<br />    host <br />FROM <br />    <tableName/logGroup> <br />WHERE <br />    method LIKE 'D%'</pre>  | 
| [OFFSET](#supported-sql-offset) | Spécifie le nombre de lignes à ignorer avant de commencer à renvoyer des lignes depuis la requête. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Pris en charge lorsqu'il est utilisé conjointement avec une LIMIT clause dans une requête. Par exemple :[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/supported-directquery-sql.html) | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> SELECT <br />    method,<br />    status,<br />    bytes,<br />    datetime <br />FROM <br />    <tableName/logGroup> <br />ORDER BY <br />    datetime<br />OFFSET <br />    10 </pre>  | 
| [Clause PIVOT](#supported-sql-pivot) | Transforme les lignes en colonnes, faisant passer les données d'un format basé sur des lignes à un format basé sur des colonnes. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    * <br />FROM <br />    (<br />        SELECT <br />            method,<br />            status,<br />            bytes<br />        FROM <br />            <tableName/logGroup><br />    ) AS SourceTable <br />PIVOT <br />(<br />    SUM(bytes) <br />    FOR method IN ('GET', 'POST', 'PATCH', 'PUT', 'DELETE')<br />) AS PivotTable</pre>  | 
| [Définir les opérateurs](#supported-sql-set) | Combine les résultats de deux ou plusieurs instructions SELECT (par exemple, UNION, INTERSECT, EXCEPT). | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    method,<br />    status,<br />    bytes<br />FROM <br />    <tableName/logGroup><br />WHERE <br />    status = '416'<br /><br />UNION<br /><br />SELECT <br />    method,<br />    status,<br />    bytes<br />FROM <br />    <tableName/logGroup><br />WHERE <br />    bytes > 20000</pre>  | 
| [Clause TRIER PAR](#supported-sql-sort-by) | Spécifie l'ordre dans lequel les résultats de la requête doivent être renvoyés. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    method,<br />    status,<br />    bytes<br />FROM <br />    <tableName/logGroup><br />SORT BY <br />    bytes DESC</pre>  | 
| [UNPIVOT](#supported-sql-unpivot) | Transforme les colonnes en lignes, en faisant passer les données d'un format basé sur des colonnes à un format basé sur des lignes. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> SELECT <br />    status,<br />    REPLACE(method, '_bytes', '') AS request_method,<br />    bytes,<br />    datetime <br />FROM <br />    PivotedData <br />UNPIVOT <br />(<br />    bytes <br />    FOR method IN <br />    (<br />        GET_bytes,<br />        POST_bytes,<br />        PATCH_bytes,<br />        PUT_bytes,<br />        DELETE_bytes<br />    )<br />) AS UnpivotedData</pre>  | 

## Fonctions
<a name="supported-sql-functions"></a>

**Note**  
Dans la colonne des exemples de commandes, remplacez le cas `<tableName/logGroup>` échéant en fonction de la source de données que vous interrogez.   
Exemple de commande : `SELECT Body , Operation FROM <tableName/logGroup>` 
Si vous interrogez Amazon S3 ou Security Lake, utilisez : `SELECT Body , Operation FROM table_name` 
Si vous interrogez CloudWatch Logs, utilisez : `SELECT Body , Operation FROM `LogGroupA`` 


| Grammaire SQL disponible | Description | CloudWatch Journaux | Amazon S3 | Security Lake | Exemple de commande  | 
| --- | --- | --- | --- | --- | --- | 
| [Fonctions de chaîne](#supported-sql-string) |  Fonctions intégrées permettant de manipuler et de transformer des chaînes et des données de texte dans des requêtes SQL. Par exemple, convertir des majuscules, combiner des chaînes, extraire des parties et nettoyer du texte.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    UPPER(method) AS upper_method,<br />    LOWER(host) AS lower_host <br />FROM <br />    <tableName/logGroup></pre>  | 
| [Fonctions de date et d’heure](#supported-sql-date-time) |  Fonctions intégrées pour gérer et transformer les données de date et d'horodatage dans les requêtes. **Par exemple, **date\$1add, date\$1format****, datediff et **current\$1date****.**  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    TO_TIMESTAMP(datetime) AS timestamp,<br />    TIMESTAMP_SECONDS(UNIX_TIMESTAMP(datetime)) AS from_seconds,<br />    UNIX_TIMESTAMP(datetime) AS to_unix,<br />    FROM_UTC_TIMESTAMP(datetime, 'PST') AS to_pst,<br />    TO_UTC_TIMESTAMP(datetime, 'EST') AS from_est <br />FROM <br />    <tableName/logGroup></pre>  | 
| [Fonctions d’agrégation](#supported-sql-aggregate) |  Fonctions intégrées qui effectuent des calculs sur plusieurs lignes pour produire une seule valeur résumée. Par exemple, **sum**, **count**, **avg**, **max** et **min.**  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    COUNT(*) AS total_records,<br />    COUNT(DISTINCT method) AS unique_methods,<br />    SUM(bytes) AS total_bytes,<br />    AVG(bytes) AS avg_bytes,<br />    MIN(bytes) AS min_bytes,<br />    MAX(bytes) AS max_bytes <br />FROM <br />    <tableName/logGroup></pre>  | 
| [Fonctions conditionnelles](#supported-sql-conditional) |  Fonctions intégrées qui exécutent des actions en fonction de conditions spécifiées ou qui évaluent les expressions de manière conditionnelle. Par exemple, **CASE** et **IF**.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    CASE <br />        WHEN method = 'GET' AND bytes < 1000 THEN 'Small Read'<br />        WHEN method = 'POST' AND bytes > 10000 THEN 'Large Write'<br />        WHEN status >= 400 OR bytes = 0 THEN 'Problem'<br />        ELSE 'Normal'<br />    END AS request_type <br />FROM <br />    <tableName/logGroup></pre>  | 
| [Fonctions JSON](#supported-sql-json) |  Fonctions intégrées pour analyser, extraire, modifier et interroger des données au format JSON dans des requêtes SQL (par exemple, from\$1json, to\$1json, get\$1json\$1object, json\$1tuple) permettant de manipuler les structures JSON dans les ensembles de données.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    FROM_JSON(<br />        @message, <br />        'STRUCT<<br />            host: STRING,<br />            user-identifier: STRING,<br />            datetime: STRING,<br />            method: STRING,<br />            status: INT,<br />            bytes: INT<br />        >'<br />    ) AS parsed_json <br />FROM <br />    <tableName/logGroup> </pre>  | 
| [Fonctions de tableau](#supported-sql-array) |  Fonctions intégrées permettant de travailler avec des colonnes de type tableau dans les requêtes SQL, permettant des opérations telles que l'accès, la modification et l'analyse de données de tableau (par exemple, size, explode, array\$1contains).  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    scores,<br />    size(scores) AS length,<br />    array_contains(scores, 90) AS has_90 <br />FROM <br />    <tableName/logGroup></pre>  | 
| [Fonctions de fenêtrage](#supported-sql-window) | Fonctions intégrées qui effectuent des calculs sur un ensemble spécifique de lignes liées à la ligne actuelle (fenêtre), permettant des opérations telles que le classement, les totaux cumulés et les moyennes mobiles (par exemple, ROW\$1NUMBER, RANK, LAG, LEAD) | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> SELECT <br />    field1,<br />    field2,<br />    RANK() OVER (ORDER BY field2 DESC) AS field2Rank <br />FROM <br />    <tableName/logGroup></pre>  | 
| [Fonctions de conversion](#supported-sql-conversion) |  Fonctions intégrées pour convertir des données d'un type à un autre dans les requêtes SQL, permettant des transformations de type de données et des conversions de format (par exemple, CAST, TO\$1DATE, TO\$1TIMESTAMP, BINARY)  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    CAST('123' AS INT) AS converted_number,<br />    CAST(123 AS STRING) AS converted_string <br />FROM <br />    <tableName/logGroup></pre>  | 
| [Fonctions de prédicat](#supported-sql-predicate) |  Fonctions intégrées qui évaluent les conditions et renvoient des valeurs booléennes (vrai/faux) en fonction de critères ou de modèles spécifiés (par exemple, IN, LIKE, BETWEEN, IS NULL, EXISTS)  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    * <br />FROM <br />    <tableName/logGroup> <br />WHERE <br />    id BETWEEN 50000 AND 75000</pre>  | 
| [Fonctions cartographiques](#supported-sql-map) | Applique une fonction spécifiée à chaque élément d'une collection, transformant les données en un nouvel ensemble de valeurs. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    MAP_FILTER(<br />        MAP(<br />            'method', method,<br />            'status', CAST(status AS STRING),<br />            'bytes', CAST(bytes AS STRING)<br />        ),<br />        (k, v) -> k IN ('method', 'status') AND v != 'null'<br />    ) AS filtered_map <br />FROM <br />    <tableName/logGroup> <br />WHERE <br />    status = 100</pre>  | 
| [Fonctions mathématiques](#supported-sql-math) | Effectue des opérations mathématiques sur des données numériques, telles que le calcul de moyennes, de sommes ou de valeurs trigonométriques. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    bytes,<br />    bytes + 1000 AS added,<br />    bytes - 1000 AS subtracted,<br />    bytes * 2 AS doubled,<br />    bytes / 1024 AS kilobytes,<br />    bytes % 1000 AS remainder <br />FROM <br />    <tableName/logGroup></pre>  | 
| [Fonctions de groupe multilog](#multi-log-queries) |  Permet aux utilisateurs de spécifier plusieurs groupes de journaux dans une instruction SQL SELECT  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | Non applicable | Non applicable |  <pre>SELECT <br />    lg1.Column1,<br />    lg1.Column2 <br />FROM <br />    `logGroups(logGroupIdentifier: ['LogGroup1', 'LogGroup2'])` AS lg1 <br />WHERE <br />    lg1.Column3 = "Success"<br /></pre>  | 
| [Fonctions du générateur](#supported-sql-generator) | Crée un objet itérateur qui produit une séquence de valeurs, permettant une utilisation efficace de la mémoire dans les grands ensembles de données. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>SELECT <br />    explode(array(10, 20)) </pre>  | 

## Restrictions SQL générales
<a name="general-sql-restrictions"></a>

Les restrictions suivantes s'appliquent lors de l'utilisation de OpenSearch SQL with CloudWatch Logs, Amazon S3 et Security Lake.

1. Vous ne pouvez utiliser qu'une seule opération JOIN dans une instruction SELECT.

1. Un seul niveau de sous-requêtes imbriquées est pris en charge.

1. Les requêtes d'instructions multiples séparées par des points-virgules ne sont pas prises en charge.

1. Les requêtes contenant des noms de champs identiques mais différents uniquement au cas où (par exemple field1 et FIELD1) ne sont pas prises en charge.

   Par exemple, les requêtes suivantes ne sont pas prises en charge :

   ```
   Select AWSAccountId, awsaccountid from LogGroup
   ```

   Cependant, la requête suivante est due au fait que le nom du champ (@logStream) est identique dans les deux groupes de journaux :

   ```
   Select a.`@logStream`, b.`@logStream` from Table A INNER Join Table B on a.id = b.id 
   ```

1. Les fonctions et expressions doivent agir sur les noms de champs et faire partie d'une instruction SELECT avec un groupe de journaux spécifié dans la clause FROM.

   Par exemple, cette requête n'est pas prise en charge :

   ```
   SELECT cos(10) FROM LogGroup
   ```

   Cette requête est prise en charge :

   ```
   SELECT cos(field1) FROM LogGroup
   ```

## Informations supplémentaires pour les utilisateurs de CloudWatch Logs Insights utilisant OpenSearch SQL
<a name="supported-sql-for-multi-log-queries"></a>

 CloudWatch Logs prend en charge les requêtes OpenSearch SQL dans la console, l'API et la CLI de Logs Insights. Il prend en charge la plupart des commandes, notamment SELECT, FROM, WHERE, GROUP BY, HAVING, JOINS et les requêtes imbriquées, ainsi que les fonctions JSON, mathématiques, de chaîne et conditionnelles. Cependant, CloudWatch Logs ne prend en charge que les opérations de lecture et n'autorise donc pas les instructions DDL ou DML. Consultez les tableaux des sections précédentes pour obtenir la liste complète des commandes et fonctions prises en charge. 

### Fonctions de groupe multilog
<a name="multi-log-queries"></a>

CloudWatch Logs Insights permet d'interroger plusieurs groupes de journaux. Pour résoudre ce cas d'utilisation dans SQL, vous pouvez utiliser la `logGroups` commande. Cette commande est spécifique à l'interrogation de données dans CloudWatch Logs Insights impliquant un ou plusieurs groupes de journaux. Utilisez cette syntaxe pour interroger plusieurs groupes de journaux en les spécifiant dans la commande, au lieu d'écrire une requête pour chacun des groupes de journaux et de les combiner avec une `UNION` commande. 

Syntaxe :

```
`logGroups(
    logGroupIdentifier: ['LogGroup1','LogGroup2', ...'LogGroupn']
)
```

Dans cette syntaxe, vous pouvez spécifier jusqu'à 50 groupes de journaux dans le `logGroupIndentifier` paramètre. Pour référencer des groupes de journaux dans un compte de surveillance, utilisez ARNs plutôt que des `LogGroup` noms.

Exemple de requête :

```
SELECT LG1.Column1, LG1.Column2 from `logGroups(
    logGroupIdentifier: ['LogGroup1', 'LogGroup2']
)` as LG1 
WHERE LG1.Column1 = 'ABC'
```

La syntaxe suivante impliquant plusieurs groupes de journaux après l'`FROM`instruction n'est pas prise en charge lors de l'interrogation CloudWatch des journaux :

```
SELECT Column1, Column2 FROM 'LogGroup1', 'LogGroup2', ...'LogGroupn' 
WHERE Column1 = 'ABC'
```

### Restrictions
<a name="restrictions"></a>

Lorsque vous utilisez des commandes SQL ou PPL, entourez certains champs de backticks pour les interroger. Les champs contenant des caractères spéciaux (non alphabétiques et non numériques) doivent être cochés. Par exemple, joignez `Operation.Export,` et `@message` insérez des `Test::Field` backticks. Il n'est pas nécessaire de placer des colonnes avec des noms purement alphabétiques en backticks.

Exemple de requête avec des champs simples :

```
SELECT SessionToken, Operation, StartTime  FROM `LogGroup-A`
LIMIT 1000;
```

Même requête avec des backticks ajoutés :

```
SELECT `SessionToken`, `Operation`, `StartTime`  FROM `LogGroup-A`
LIMIT 1000;
```

Pour des restrictions générales supplémentaires qui ne sont pas spécifiques aux CloudWatch journaux, consultez[Restrictions SQL générales](#general-sql-restrictions).

### Exemples de requêtes et de quotas
<a name="samples"></a>

**Note**  
Ce qui suit s'applique à la fois aux utilisateurs de CloudWatch Logs Insights et OpenSearch aux utilisateurs interrogeant CloudWatch des données.

Pour des exemples de requêtes SQL que vous pouvez utiliser dans CloudWatch Logs, consultez la section Requêtes **enregistrées et exemples de requêtes** dans la console Amazon CloudWatch Logs Insights pour des exemples.

Pour plus d'informations sur les limites applicables lors de l'interrogation de CloudWatch Logs from OpenSearch Service, consultez la section [Quotas de CloudWatch journaux](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html) dans le guide de l'utilisateur Amazon CloudWatch Logs. Les limites concernent le nombre de groupes de CloudWatch journaux que vous pouvez interroger, le nombre maximal de requêtes simultanées que vous pouvez exécuter, le temps d'exécution maximal des requêtes et le nombre maximum de lignes renvoyées dans les résultats. Les limites sont les mêmes quel que soit le langage que vous utilisez pour interroger les CloudWatch journaux (à savoir, OpenSearch PPL, SQL et Logs Insights). 

### Commandes SQL
<a name="supported-sql-commands-details"></a>

**Topics**
+ [Fonctions de chaîne](#supported-sql-string)
+ [Fonctions de date et d’heure](#supported-sql-date-time)
+ [Fonctions d’agrégation](#supported-sql-aggregate)
+ [Fonctions conditionnelles](#supported-sql-conditional)
+ [Fonctions JSON](#supported-sql-json)
+ [Fonctions de tableau](#supported-sql-array)
+ [Fonctions de fenêtrage](#supported-sql-window)
+ [Fonctions de conversion](#supported-sql-conversion)
+ [Fonctions de prédicat](#supported-sql-predicate)
+ [Fonctions cartographiques](#supported-sql-map)
+ [Fonctions mathématiques](#supported-sql-math)
+ [Fonctions du générateur](#supported-sql-generator)
+ [Clause SELECT](#supported-sql-select)
+ [Clause WHERE](#supported-sql-where)
+ [Clause GROUP BY](#supported-sql-group-by)
+ [Clause HAVING](#supported-sql-having)
+ [Clause ORDER BY](#supported-sql-order-by)
+ [Clause JOIN](#supported-sql-join)
+ [Clause LIMIT](#supported-sql-limit)
+ [Clause CASE](#supported-sql-case)
+ [Expression de table commune](#supported-sql-cte)
+ [EXPLAIN](#supported-sql-explain)
+ [Clause LATERAL SUBQUERY](#supported-sql-lateral-subquery)
+ [Clause de vue latérale](#supported-sql-lateral-view)
+ [Prédicat LIKE](#supported-sql-like-predicate)
+ [OFFSET](#supported-sql-offset)
+ [Clause PIVOT](#supported-sql-pivot)
+ [Définir les opérateurs](#supported-sql-set)
+ [Clause TRIER PAR](#supported-sql-sort-by)
+ [UNPIVOT](#supported-sql-unpivot)

#### Fonctions de chaîne
<a name="supported-sql-string"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).


****  

| Fonction | Description | 
| --- | --- | 
| ascii (étoile) | Renvoie la valeur numérique du premier caractère destr. | 
| base64 (bac) | Convertit l'argument d'un binaire bin en une chaîne de base 64. | 
| bit\$1length (expr) | Renvoie la longueur en bits des données de chaîne ou le nombre de bits de données binaires. | 
| btrim (étoile) | Supprime les espaces de début et de fin destr. | 
| btrim (str, TrimStr) | Supprimez les trimStr caractères de début et de fin destr. | 
| chaise (expr) | Renvoie le caractère ASCII dont l'équivalent binaire est. expr Si n est supérieur à 256, le résultat est équivalent à chr (n % 256) | 
| char\$1length (expr) | Renvoie la longueur en caractères d'une chaîne de données ou le nombre d'octets de données binaires. La longueur des données de chaîne inclut les espaces de fin. La longueur des données binaires inclut des zéros binaires. | 
| longueur\$1caractère (expr) | Renvoie la longueur en caractères d'une chaîne de données ou le nombre d'octets de données binaires. La longueur des données de chaîne inclut les espaces de fin. La longueur des données binaires inclut des zéros binaires. | 
| chr (expr) | Renvoie le caractère ASCII dont l'équivalent binaire est. expr Si n est supérieur à 256, le résultat est équivalent à chr (n % 256) | 
| concat\$1ws (sep [, str \$1 array (str)] \$1) | Renvoie la concaténation des chaînes séparées parsep, en ignorant les valeurs nulles. | 
| contient (gauche, droite) | Renvoie une valeur booléenne. La valeur est True si la droite se trouve à l'intérieur de la gauche. Renvoie NULL si l'une des expressions d'entrée est NULL. Dans le cas contraire, renvoie False. La gauche ou la droite doivent être de type STRING ou BINARY. | 
| décoder (bin, charset) | Décode le premier argument à l'aide du jeu de caractères du second argument. | 
| décoder (expr, recherche, résultat [, recherche, résultat]... [, par défaut]) | Compare expr à chaque valeur de recherche dans l'ordre. Si expr est égal à une valeur de recherche, decode renvoie le résultat correspondant. Si aucune correspondance n'est trouvée, elle renvoie la valeur par défaut. Si la valeur par défaut est omise, elle renvoie la valeur null. | 
| elt (n, entrée1, entrée2,...) | Renvoie la n -ème entrée, par exemple, renvoie input2 quand n est égal à 2.  | 
| encoder (str, jeu de caractères) | Encode le premier argument à l'aide du jeu de caractères du second argument. | 
| se termine par (gauche, droite) | Renvoie une valeur booléenne. La valeur est True si la gauche se termine par la droite. Renvoie NULL si l'une des expressions d'entrée est NULL. Dans le cas contraire, renvoie False. La gauche ou la droite doivent être de type STRING ou BINARY. | 
| find\$1in\$1set (str, str\$1array) | Renvoie l'index (basé sur 1) de la chaîne donnée (str) dans la liste séparée par des virgules (). str\$1array Renvoie 0, si la chaîne n'a pas été trouvée ou si la chaîne donnée (str) contient une virgule. | 
| numéro\$1format (expr1, expr2) | Formate le nombre expr1 comme « \$1, \$1\$1\$1, \$1\$1\$1.\$1\$1 », arrondi à la décimale près. expr2 S'il expr2 est égal à 0, le résultat ne comporte ni virgule décimale ni partie fractionnaire. expr2accepte également un format spécifié par l'utilisateur. Ceci est censé fonctionner comme le FORMAT de MySQL. | 
| format\$1string (strfmt, obj,...) | Renvoie une chaîne formatée à partir de chaînes de format de style printf. | 
| initcap (star) | Renvoie str la première lettre de chaque mot en majuscule. Toutes les autres lettres sont en minuscules. Les mots sont délimités par des espaces blancs. | 
| instr (étoile, substance) | Renvoie l'indice (basé sur 1) de la première occurrence de substr instr. | 
| lcase (étoile) | Retourne str avec tous les caractères changés en minuscules. | 
| gauche (str, len) | Renvoie les caractères les plus à gauche len (lenpeuvent être de type chaîne) de la chaîne. S'il len est inférieur ou égal à 0str, le résultat est une chaîne vide. | 
| objectif (expr) | Renvoie la longueur en caractères d'une chaîne de données ou le nombre d'octets de données binaires. La longueur des données de chaîne inclut les espaces de fin. La longueur des données binaires inclut des zéros binaires. | 
| longueur (expr) | Renvoie la longueur en caractères d'une chaîne de données ou le nombre d'octets de données binaires. La longueur des données de chaîne inclut les espaces de fin. La longueur des données binaires inclut des zéros binaires. | 
| levenshtein (str1, str2 [, seuil]) | Renvoie la distance de Levenshtein entre les deux chaînes données. Si le seuil est défini et que la distance est supérieure à celui-ci, renvoie -1. | 
| localiser (substr, str [, pos]) | Renvoie la position de la première occurrence de substr in str after positionpos. La valeur donnée pos et la valeur renvoyée sont basées sur 1. | 
| inférieur (étoile) | Retourne str avec tous les caractères changés en minuscules. | 
| lpad (str, len [, pad]) | Renvoiestr, rempli pad à gauche avec une longueur de. len Si str cette valeur est supérieure àlen, la valeur renvoyée est réduite en len caractères ou en octets. Si pad ce n'est pas spécifié, il str sera complété vers la gauche par des espaces s'il s'agit d'une chaîne de caractères, et par des zéros s'il s'agit d'une séquence d'octets. | 
| ltrim (étoile) | Supprime les espaces principaux destr. | 
| lun\$1check (star) | Vérifie qu'une chaîne de chiffres est valide selon l'algorithme de Luhn. Cette fonction de somme de contrôle est largement appliquée aux numéros de carte de crédit et aux numéros d'identification gouvernementaux pour distinguer les numéros valides des numéros mal orthographiés et incorrects. | 
| masque (input [, UpperChar, LowerChar, DigitChar, OtherChar]) | masque la valeur de chaîne donnée. La fonction remplace les caractères par « X » ou « x », et les nombres par « n ». Cela peut être utile pour créer des copies de tables contenant des informations sensibles supprimées. | 
| longueur d'octet (expr) | Renvoie la longueur en octets des données de chaîne ou le nombre d'octets de données binaires. | 
| superposition (entrée, remplacement, pos [, len]) | Remplacez input par un nom replace qui commence à pos et qui est longlen. | 
| position (substr, str [, pos]) | Renvoie la position de la première occurrence de substr in str after positionpos. La valeur donnée pos et la valeur renvoyée sont basées sur 1. | 
| printf (strfmt, obj,...) | Renvoie une chaîne formatée à partir de chaînes de format de style printf. | 
| regexp\$1count (str, regexp) | Renvoie le nombre de fois que le modèle d'expression régulière regexp est mis en correspondance dans la chaînestr. | 
| regexp\$1extract (str, regexp [, idx]) | Extrayez la première chaîne str qui correspond à l'regexpexpression et qui correspond à l'index du groupe regex. | 
| regexp\$1extract\$1all (str, regexp [, idx]) | Extrayez toutes les chaînes du str qui correspondent à l'regexpexpression et qui correspondent à l'index du groupe regex. | 
| regexp\$1instr (str, regexp) | Recherche une expression régulière dans une chaîne et renvoie un entier indiquant la position de début de la sous-chaîne correspondante. Les positions sont basées sur 1 et non sur 0. Si aucune correspondance n'est trouvée, renvoie 0. | 
| regexp\$1replace (str, regexp, rep [, position]) | Remplace toutes les sous-chaînes str correspondant regexp parrep. | 
| regexp\$1substr (str, regexp) | Renvoie la sous-chaîne qui correspond à l'expression régulière contenue regexp dans la chaînestr. Si l'expression régulière n'est pas trouvée, le résultat est nul. | 
| répéter (str, n) | Renvoie la chaîne qui répète n fois la valeur de chaîne donnée. | 
| remplacer (str, search [, remplacer]) | Remplace toutes les occurrences de search withreplace. | 
| droite (star, len) | Renvoie les caractères les plus à droite len (lenpeut être de type chaîne) de la chaîne. S'il len est inférieur ou égal à 0str, le résultat est une chaîne vide. | 
| rpad (str, len [, pad]) | Renvoiestr, rembourré pad à droite avec une longueur de. len Si str cette valeur est supérieure àlen, la valeur renvoyée est réduite en len caractères. Si pad ce n'est pas spécifié, il str sera complété vers la droite par des espaces s'il s'agit d'une chaîne de caractères, et par des zéros s'il s'agit d'une chaîne binaire. | 
| rtrim (étoile) | Supprime les espaces de fin destr. | 
| phrases (str [, lang, country]) | Se str divise en un tableau de mots. | 
| soundex (star) | Renvoie le code Soundex de la chaîne. | 
| espace (n) | Renvoie une chaîne composée d'nespaces. | 
| split (str, regex, limite) | Divise str les occurrences qui correspondent regex et renvoie un tableau d'une longueur maximale de limit | 
| split\$1part (str, délimiteur, PartNum) | Divise str par délimiteur et renvoie la partie demandée de la division (base 1). Si une entrée est nulle, renvoie null. si elle partNum est hors de portée des parties divisées, renvoie une chaîne vide. Si la partNum valeur est 0, renvoie une erreur. S'il partNum est négatif, les parties sont comptées à rebours à partir de la fin de la chaîne. S'il s'delimiteragit d'une chaîne vide, elle n'strest pas divisée. | 
| commence par (gauche, droite) | Renvoie une valeur booléenne. La valeur est True si la gauche commence par la droite. Renvoie NULL si l'une des expressions d'entrée est NULL. Dans le cas contraire, renvoie False. La gauche ou la droite doivent être de type STRING ou BINARY. | 
| substr (str, pos [, len]) | Renvoie la sous-chaîne str dont la longueur commence à pos et est longuelen, ou la tranche de tableau d'octets qui commence à pos et est de longueurlen. | 
| substr (str FROM pos [POUR len]]) | Renvoie la sous-chaîne str dont la longueur commence à pos et est longuelen, ou la tranche de tableau d'octets qui commence à pos et est de longueurlen. | 
| sous-chaîne (str, pos [, len]) | Renvoie la sous-chaîne str dont la longueur commence à pos et est longuelen, ou la tranche de tableau d'octets qui commence à pos et est de longueurlen. | 
| sous-chaîne (str FROM pos [POUR len]]) | Renvoie la sous-chaîne str dont la longueur commence à pos et est longuelen, ou la tranche de tableau d'octets qui commence à pos et est de longueurlen. | 
| substring\$1index (str, delim, count) | Renvoie la sous-chaîne située str avant les count occurrences du delim délimiteur. S'il count est positif, tout ce qui se trouve à gauche du délimiteur final (en partant de la gauche) est renvoyé. S'il count est négatif, tout ce qui se trouve à droite du délimiteur final (en partant de la droite) est renvoyé. La fonction substring\$1index effectue une correspondance entre majuscules et minuscules lors de la recherche. delim | 
| to\$1binary (str [, fmt]) | Convertit l'entrée str en une valeur binaire basée sur la valeur fourniefmt. fmtpeut être une chaîne littérale insensible aux majuscules et minuscules de « hex », « utf-8 », « utf8 » ou « base64 ». Par défaut, le format binaire de conversion est « hexadécimal » s'il fmt est omis. La fonction renvoie NULL si au moins un des paramètres d'entrée est NULL. | 
| to\$1char (NumberExpr, FormatExpr) | Convertir numberExpr en une chaîne basée surformatExpr. Lance une exception si la conversion échoue. Le format peut être composé des caractères suivants, sans distinction majuscules/minuscules : « 0 » ou « 9 » : Spécifie un chiffre attendu compris entre 0 et 9. Une séquence de 0 ou 9 dans la chaîne de format correspond à une séquence de chiffres dans la valeur d'entrée, générant une chaîne de résultat de la même longueur que la séquence correspondante dans la chaîne de format. La chaîne de résultat est remplie de zéros à gauche si la séquence 0/9 comprend plus de chiffres que la partie correspondante de la valeur décimale, commence par 0 et se situe avant le point décimal. Sinon, il est rempli d'espaces. '.' ou 'D' : Spécifie la position du point décimal (facultatif, autorisé une seule fois). ',' ou 'G' : Spécifie la position du séparateur de regroupement (milliers) (,). Il doit y avoir un 0 ou un 9 à gauche et à droite de chaque séparateur de regroupement. ' | 
| to\$1number (expr, fmt) | Convertissez la chaîne « expr » en un nombre basé sur le format de chaîne « fmt ». Lance une exception si la conversion échoue. Le format peut être composé des caractères suivants, sans distinction majuscules/minuscules : « 0 » ou « 9 » : Spécifie un chiffre attendu compris entre 0 et 9. Une séquence de 0 ou 9 dans la chaîne de format correspond à une séquence de chiffres dans la chaîne d'entrée. Si la séquence 0/9 commence par 0 et se situe avant le point décimal, elle ne peut correspondre qu'à une séquence de chiffres de même taille. Sinon, si la séquence commence par 9 ou après la virgule décimale, elle peut correspondre à une séquence de chiffres de taille identique ou inférieure. '.' ou 'D' : Spécifie la position du point décimal (facultatif, autorisé une seule fois). ',' ou 'G' : Spécifie la position du séparateur de regroupement (milliers) (,). Il doit y avoir un 0 ou un 9 à gauche et à droite de chaque séparateur de regroupement. « expr » doit correspondre au séparateur de regroupement correspondant à la taille du numéro. ' | 
| to\$1varchar (NumberExpr, FormatExpr) | Convertir numberExpr en une chaîne basée surformatExpr. Lance une exception si la conversion échoue. Le format peut être composé des caractères suivants, sans distinction majuscules/minuscules : « 0 » ou « 9 » : Spécifie un chiffre attendu compris entre 0 et 9. Une séquence de 0 ou 9 dans la chaîne de format correspond à une séquence de chiffres dans la valeur d'entrée, générant une chaîne de résultat de la même longueur que la séquence correspondante dans la chaîne de format. La chaîne de résultat est remplie de zéros à gauche si la séquence 0/9 comprend plus de chiffres que la partie correspondante de la valeur décimale, commence par 0 et se situe avant le point décimal. Sinon, il est rempli d'espaces. '.' ou 'D' : Spécifie la position du point décimal (facultatif, autorisé une seule fois). ',' ou 'G' : Spécifie la position du séparateur de regroupement (milliers) (,). Il doit y avoir un 0 ou un 9 à gauche et à droite de chaque séparateur de regroupement. ' | 
| traduire (entrée, de, vers) | Traduit la input chaîne en remplaçant les caractères présents dans la from chaîne par les caractères correspondants de la to chaîne. | 
| trim (étoile) | Supprime les espaces de début et de fin destr. | 
| trim (LES DEUX À PARTIR DE str) | Supprime les espaces de début et de fin destr. | 
| trim (EN PARTANT DE L'ÉTOILE) | Supprime les espaces principaux destr. | 
| trim (TIRÉ D'UNE étoile) | Supprime les espaces de fin destr. | 
| trim (TrimStr FROM str) | Supprimez les trimStr caractères de début et de fin destr. | 
| trim (À LA FOIS TRIMSTR ET str) | Supprimez les trimStr caractères de début et de fin destr. | 
| trim (PREMIER TRIMSTR À PARTIR DE str) | Supprimez les premiers trimStr caractères destr. | 
| trim (TIRANT TRIMSTR DE str) | Supprimez les derniers trimStr caractères de. str | 
| try\$1to\$1binary (str [, fmt]) | Il s'agit d'une version spéciale to\$1binary qui exécute la même opération, mais renvoie une valeur NULL au lieu de générer une erreur si la conversion ne peut pas être effectuée. | 
| try\$1to\$1number (expr, fmt) | Convertissez la chaîne « expr » en un nombre basé sur le format fmt de chaîne. Renvoie NULL si la chaîne « expr » ne correspond pas au format attendu. Le format suit la même sémantique que la fonction to\$1number. | 
| Ucase (étoile) | Retourne str avec tous les caractères changés en majuscules. | 
| unbase64 (str) | Convertit l'argument d'une chaîne de base 64 str en binaire. | 
| supérieur (étoile) | Retourne str avec tous les caractères changés en majuscules. | 



**Exemples**

```
-- ascii
SELECT ascii('222');
+----------+
|ascii(222)|
+----------+
|        50|
+----------+
SELECT ascii(2);
+--------+
|ascii(2)|
+--------+
|      50|
+--------+
-- base64
SELECT base64('Feathers');
+-----------------+
|base64(Feathers)|
+-----------------+
|     RmVhdGhlcnM=|
+-----------------+
SELECT base64(x'537061726b2053514c');
+-----------------------------+
|base64(X'537061726B2053514C')|
+-----------------------------+
|                 U3BhcmsgU1FM|
+-----------------------------+
-- bit_length
SELECT bit_length('Feathers');
+---------------------+
|bit_length(Feathers)|
+---------------------+
|                   64|
+---------------------+
SELECT bit_length(x'537061726b2053514c');
+---------------------------------+
|bit_length(X'537061726B2053514C')|
+---------------------------------+
|                               72|
+---------------------------------+
-- btrim
SELECT btrim('    Feathers   ');
+----------------------+
|btrim(    Feathers   )|
+----------------------+
|              Feathers|
+----------------------+
SELECT btrim(encode('    Feathers   ', 'utf-8'));
+-------------------------------------+
|btrim(encode(    Feathers   , utf-8))|
+-------------------------------------+
|                             Feathers|
+-------------------------------------+
SELECT btrim('Feathers', 'Fe');
+---------------------+
|btrim(Alphabet, Al)|
+---------------------+
|               athers|
+---------------------+
SELECT btrim(encode('Feathers', 'utf-8'), encode('Al', 'utf-8'));
+---------------------------------------------------+
|btrim(encode(Feathers, utf-8), encode(Al, utf-8))|
+---------------------------------------------------+
|                                             athers|
+---------------------------------------------------+
-- char
SELECT char(65);
+--------+
|char(65)|
+--------+
|       A|
+--------+
-- char_length
SELECT char_length('Feathers ');
+-----------------------+
|char_length(Feathers )|
+-----------------------+
|                     9 |
+-----------------------+
SELECT char_length(x'537061726b2053514c');
+----------------------------------+
|char_length(X'537061726B2053514C')|
+----------------------------------+
|                                 9|
+----------------------------------+
SELECT CHAR_LENGTH('Feathers ');
+-----------------------+
|char_length(Feathers )|
+-----------------------+
|                     9|
+-----------------------+
SELECT CHARACTER_LENGTH('Feathers ');
+----------------------------+
|character_length(Feathers )|
+----------------------------+
|                          9|
+----------------------------+
-- character_length
SELECT character_length('Feathers ');
+----------------------------+
|character_length(Feathers )|
+----------------------------+
|                          9|
+----------------------------+
SELECT character_length(x'537061726b2053514c');
+---------------------------------------+
|character_length(X'537061726B2053514C')|
+---------------------------------------+
|                                      9|
+---------------------------------------+
SELECT CHAR_LENGTH('Feathers ');
+-----------------------+
|char_length(Feathers )|
+-----------------------+
|                     9|
+-----------------------+
SELECT CHARACTER_LENGTH('Feathers ');
+----------------------------+
|character_length(Feathers )|
+----------------------------+
|                          9|
+----------------------------+
-- chr
SELECT chr(65);
+-------+
|chr(65)|
+-------+
|      A|
+-------+
-- concat_ws
SELECT concat_ws(' ', 'Fea', 'thers');
+------------------------+
|concat_ws( , Fea, thers)|
+------------------------+
|               Feathers|
+------------------------+
SELECT concat_ws('s');
+------------+
|concat_ws(s)|
+------------+
|            |
+------------+
SELECT concat_ws('/', 'foo', null, 'bar');
+----------------------------+
|concat_ws(/, foo, NULL, bar)|
+----------------------------+
|                     foo/bar|
+----------------------------+
SELECT concat_ws(null, 'Fea', 'thers');
+---------------------------+
|concat_ws(NULL, Fea, thers)|
+---------------------------+
|                       NULL|
+---------------------------+
-- contains
SELECT contains('Feathers', 'Fea');
+--------------------------+
|contains(Feathers, Fea)|
+--------------------------+
|                      true|
+--------------------------+
SELECT contains('Feathers', 'SQL');
+--------------------------+
|contains(Feathers, SQL)|
+--------------------------+
|                     false|
+--------------------------+
SELECT contains('Feathers', null);
+-------------------------+
|contains(Feathers, NULL)|
+-------------------------+
|                     NULL|
+-------------------------+
SELECT contains(x'537061726b2053514c', x'537061726b');
+----------------------------------------------+
|contains(X'537061726B2053514C', X'537061726B')|
+----------------------------------------------+
|                                          true|
+----------------------------------------------+
-- decode
SELECT decode(encode('abc', 'utf-8'), 'utf-8');
+---------------------------------+
|decode(encode(abc, utf-8), utf-8)|
+---------------------------------+
|                              abc|
+---------------------------------+
SELECT decode(2, 1, 'Southlake', 2, 'San Francisco', 3, 'New Jersey', 4, 'Seattle', 'Non domestic');
+----------------------------------------------------------------------------------+
|decode(2, 1, Southlake, 2, San Francisco, 3, New Jersey, 4, Seattle, Non domestic)|
+----------------------------------------------------------------------------------+
|                                                                     San Francisco|
+----------------------------------------------------------------------------------+
SELECT decode(6, 1, 'Southlake', 2, 'San Francisco', 3, 'New Jersey', 4, 'Seattle', 'Non domestic');
+----------------------------------------------------------------------------------+
|decode(6, 1, Southlake, 2, San Francisco, 3, New Jersey, 4, Seattle, Non domestic)|
+----------------------------------------------------------------------------------+
|                                                                      Non domestic|
+----------------------------------------------------------------------------------+
SELECT decode(6, 1, 'Southlake', 2, 'San Francisco', 3, 'New Jersey', 4, 'Seattle');
+--------------------------------------------------------------------+
|decode(6, 1, Southlake, 2, San Francisco, 3, New Jersey, 4, Seattle)|
+--------------------------------------------------------------------+
|                                                                NULL|
+--------------------------------------------------------------------+
SELECT decode(null, 6, 'Fea', NULL, 'thers', 4, 'rock');
+-------------------------------------------+
|decode(NULL, 6, Fea, NULL, thers, 4, rock)|
+-------------------------------------------+
|                                      thers|
+-------------------------------------------+
-- elt
SELECT elt(1, 'scala', 'java');
+-------------------+
|elt(1, scala, java)|
+-------------------+
|              scala|
+-------------------+
SELECT elt(2, 'a', 1);
+------------+
|elt(2, a, 1)|
+------------+
|           1|
+------------+
-- encode
SELECT encode('abc', 'utf-8');
+------------------+
|encode(abc, utf-8)|
+------------------+
|        [61 62 63]|
+------------------+
-- endswith
SELECT endswith('Feathers', 'ers');
+------------------------+
|endswith(Feathers, ers)|
+------------------------+
|                    true|
+------------------------+
SELECT endswith('Feathers', 'SQL');
+--------------------------+
|endswith(Feathers, SQL)|
+--------------------------+
|                     false|
+--------------------------+
SELECT endswith('Feathers', null);
+-------------------------+
|endswith(Feathers, NULL)|
+-------------------------+
|                     NULL|
+-------------------------+
SELECT endswith(x'537061726b2053514c', x'537061726b');
+----------------------------------------------+
|endswith(X'537061726B2053514C', X'537061726B')|
+----------------------------------------------+
|                                         false|
+----------------------------------------------+
SELECT endswith(x'537061726b2053514c', x'53514c');
+------------------------------------------+
|endswith(X'537061726B2053514C', X'53514C')|
+------------------------------------------+
|                                      true|
+------------------------------------------+
-- find_in_set
SELECT find_in_set('ab','abc,b,ab,c,def');
+-------------------------------+
|find_in_set(ab, abc,b,ab,c,def)|
+-------------------------------+
|                              3|
+-------------------------------+
-- format_number
SELECT format_number(12332.123456, 4);
+------------------------------+
|format_number(12332.123456, 4)|
+------------------------------+
|                   12,332.1235|
+------------------------------+
SELECT format_number(12332.123456, '##################.###');
+---------------------------------------------------+
|format_number(12332.123456, ##################.###)|
+---------------------------------------------------+
|                                          12332.123|
+---------------------------------------------------+
-- format_string
SELECT format_string("Hello World %d %s", 100, "days");
+-------------------------------------------+
|format_string(Hello World %d %s, 100, days)|
+-------------------------------------------+
|                       Hello World 100 days|
+-------------------------------------------+
-- initcap
SELECT initcap('Feathers');
+------------------+
|initcap(Feathers)|
+------------------+
|         Feathers|
+------------------+
-- instr
SELECT instr('Feathers', 'ers');
+--------------------+
|instr(Feathers, ers)|
+--------------------+
|                   6|
+--------------------+
-- lcase
SELECT lcase('Feathers');
+---------------+
|lcase(Feathers)|
+---------------+
|       feathers|
+---------------+
-- left
SELECT left('Feathers', 3);
+------------------+
|left(Feathers, 3)|
+------------------+
|               Fea|
+------------------+
SELECT left(encode('Feathers', 'utf-8'), 3);
+---------------------------------+
|left(encode(Feathers, utf-8), 3)|
+---------------------------------+
|                       [RmVh]|
+---------------------------------+
-- len
SELECT len('Feathers ');
+---------------+
|len(Feathers )|
+---------------+
|             9|
+---------------+
SELECT len(x'537061726b2053514c');
+--------------------------+
|len(X'537061726B2053514C')|
+--------------------------+
|                         9|
+--------------------------+
SELECT CHAR_LENGTH('Feathers ');
+-----------------------+
|char_length(Feathers )|
+-----------------------+
|                     9|
+-----------------------+
SELECT CHARACTER_LENGTH('Feathers ');
+----------------------------+
|character_length(Feathers )|
+----------------------------+
|                          9|
+----------------------------+
-- length
SELECT length('Feathers ');
+------------------+
|length(Feathers )|
+------------------+
|                9|
+------------------+
SELECT length(x'537061726b2053514c');
+-----------------------------+
|length(X'537061726B2053514C')|
+-----------------------------+
|                            9|
+-----------------------------+
SELECT CHAR_LENGTH('Feathers ');
+-----------------------+
|char_length(Feathers )|
+-----------------------+
|                     9|
+-----------------------+
SELECT CHARACTER_LENGTH('Feathers ');
+----------------------------+
|character_length(Feathers )|
+----------------------------+
|                          9|
+----------------------------+
-- levenshtein
SELECT levenshtein('kitten', 'sitting');
+----------------------------+
|levenshtein(kitten, sitting)|
+----------------------------+
|                           3|
+----------------------------+
SELECT levenshtein('kitten', 'sitting', 2);
+-------------------------------+
|levenshtein(kitten, sitting, 2)|
+-------------------------------+
|                             -1|
+-------------------------------+
-- locate
SELECT locate('bar', 'foobarbar');
+-------------------------+
|locate(bar, foobarbar, 1)|
+-------------------------+
|                        4|
+-------------------------+
SELECT locate('bar', 'foobarbar', 5);
+-------------------------+
|locate(bar, foobarbar, 5)|
+-------------------------+
|                        7|
+-------------------------+
SELECT POSITION('bar' IN 'foobarbar');
+-------------------------+
|locate(bar, foobarbar, 1)|
+-------------------------+
|                        4|
+-------------------------+
-- lower
SELECT lower('Feathers');
+---------------+
|lower(Feathers)|
+---------------+
|       feathers|
+---------------+
-- lpad
SELECT lpad('hi', 5, '??');
+---------------+
|lpad(hi, 5, ??)|
+---------------+
|          ???hi|
+---------------+
SELECT lpad('hi', 1, '??');
+---------------+
|lpad(hi, 1, ??)|
+---------------+
|              h|
+---------------+
SELECT lpad('hi', 5);
+--------------+
|lpad(hi, 5,  )|
+--------------+
|            hi|
+--------------+
SELECT hex(lpad(unhex('aabb'), 5));
+--------------------------------+
|hex(lpad(unhex(aabb), 5, X'00'))|
+--------------------------------+
|                      000000AABB|
+--------------------------------+
SELECT hex(lpad(unhex('aabb'), 5, unhex('1122')));
+--------------------------------------+
|hex(lpad(unhex(aabb), 5, unhex(1122)))|
+--------------------------------------+
|                            112211AABB|
+--------------------------------------+
-- ltrim
SELECT ltrim('    Feathers   ');
+----------------------+
|ltrim(    Feathers   )|
+----------------------+
|           Feathers   |
+----------------------+
-- luhn_check
SELECT luhn_check('8112189876');
+----------------------+
|luhn_check(8112189876)|
+----------------------+
|                  true|
+----------------------+
SELECT luhn_check('79927398713');
+-----------------------+
|luhn_check(79927398713)|
+-----------------------+
|                   true|
+-----------------------+
SELECT luhn_check('79927398714');
+-----------------------+
|luhn_check(79927398714)|
+-----------------------+
|                  false|
+-----------------------+
-- mask
SELECT mask('abcd-EFGH-8765-4321');
+----------------------------------------+
|mask(abcd-EFGH-8765-4321, X, x, n, NULL)|
+----------------------------------------+
|                     xxxx-XXXX-nnnn-nnnn|
+----------------------------------------+
SELECT mask('abcd-EFGH-8765-4321', 'Q');
+----------------------------------------+
|mask(abcd-EFGH-8765-4321, Q, x, n, NULL)|
+----------------------------------------+
|                     xxxx-QQQQ-nnnn-nnnn|
+----------------------------------------+
SELECT mask('AbCD123-@$#', 'Q', 'q');
+--------------------------------+
|mask(AbCD123-@$#, Q, q, n, NULL)|
+--------------------------------+
|                     QqQQnnn-@$#|
+--------------------------------+
SELECT mask('AbCD123-@$#');
+--------------------------------+
|mask(AbCD123-@$#, X, x, n, NULL)|
+--------------------------------+
|                     XxXXnnn-@$#|
+--------------------------------+
SELECT mask('AbCD123-@$#', 'Q');
+--------------------------------+
|mask(AbCD123-@$#, Q, x, n, NULL)|
+--------------------------------+
|                     QxQQnnn-@$#|
+--------------------------------+
SELECT mask('AbCD123-@$#', 'Q', 'q');
+--------------------------------+
|mask(AbCD123-@$#, Q, q, n, NULL)|
+--------------------------------+
|                     QqQQnnn-@$#|
+--------------------------------+
SELECT mask('AbCD123-@$#', 'Q', 'q', 'd');
+--------------------------------+
|mask(AbCD123-@$#, Q, q, d, NULL)|
+--------------------------------+
|                     QqQQddd-@$#|
+--------------------------------+
SELECT mask('AbCD123-@$#', 'Q', 'q', 'd', 'o');
+-----------------------------+
|mask(AbCD123-@$#, Q, q, d, o)|
+-----------------------------+
|                  QqQQdddoooo|
+-----------------------------+
SELECT mask('AbCD123-@$#', NULL, 'q', 'd', 'o');
+--------------------------------+
|mask(AbCD123-@$#, NULL, q, d, o)|
+--------------------------------+
|                     AqCDdddoooo|
+--------------------------------+
SELECT mask('AbCD123-@$#', NULL, NULL, 'd', 'o');
+-----------------------------------+
|mask(AbCD123-@$#, NULL, NULL, d, o)|
+-----------------------------------+
|                        AbCDdddoooo|
+-----------------------------------+
SELECT mask('AbCD123-@$#', NULL, NULL, NULL, 'o');
+--------------------------------------+
|mask(AbCD123-@$#, NULL, NULL, NULL, o)|
+--------------------------------------+
|                           AbCD123oooo|
+--------------------------------------+
SELECT mask(NULL, NULL, NULL, NULL, 'o');
+-------------------------------+
|mask(NULL, NULL, NULL, NULL, o)|
+-------------------------------+
|                           NULL|
+-------------------------------+
SELECT mask(NULL);
+-------------------------+
|mask(NULL, X, x, n, NULL)|
+-------------------------+
|                     NULL|
+-------------------------+
SELECT mask('AbCD123-@$#', NULL, NULL, NULL, NULL);
+-----------------------------------------+
|mask(AbCD123-@$#, NULL, NULL, NULL, NULL)|
+-----------------------------------------+
|                              AbCD123-@$#|
+-----------------------------------------+
-- octet_length
SELECT octet_length('Feathers');
+-----------------------+
|octet_length(Feathers)|
+-----------------------+
|                      8|
+-----------------------+
SELECT octet_length(x'537061726b2053514c');
+-----------------------------------+
|octet_length(X'537061726B2053514C')|
+-----------------------------------+
|                                  9|
+-----------------------------------+
-- overlay
SELECT overlay('Feathers' PLACING '_' FROM 6);
+----------------------------+
|overlay(Feathers, _, 6, -1)|
+----------------------------+
|                   Feathe_ers|
+----------------------------+
SELECT overlay('Feathers' PLACING 'ures' FROM 5);
+-------------------------------+
|overlay(Feathers, ures, 5, -1)|
+-------------------------------+
|                     Features  |
+-------------------------------+
-- position
SELECT position('bar', 'foobarbar');
+---------------------------+
|position(bar, foobarbar, 1)|
+---------------------------+
|                          4|
+---------------------------+
SELECT position('bar', 'foobarbar', 5);
+---------------------------+
|position(bar, foobarbar, 5)|
+---------------------------+
|                          7|
+---------------------------+
SELECT POSITION('bar' IN 'foobarbar');
+-------------------------+
|locate(bar, foobarbar, 1)|
+-------------------------+
|                        4|
+-------------------------+
-- printf
SELECT printf("Hello World %d %s", 100, "days");
+------------------------------------+
|printf(Hello World %d %s, 100, days)|
+------------------------------------+
|                Hello World 100 days|
+------------------------------------+
-- regexp_count
SELECT regexp_count('Steven Jones and Stephen Smith are the best players', 'Ste(v|ph)en');
+------------------------------------------------------------------------------+
|regexp_count(Steven Jones and Stephen Smith are the best players, Ste(v|ph)en)|
+------------------------------------------------------------------------------+
|                                                                             2|
+------------------------------------------------------------------------------+
SELECT regexp_count('abcdefghijklmnopqrstuvwxyz', '[a-z]{3}');
+--------------------------------------------------+
|regexp_count(abcdefghijklmnopqrstuvwxyz, [a-z]{3})|
+--------------------------------------------------+
|                                                 8|
+--------------------------------------------------+
-- regexp_extract
SELECT regexp_extract('100-200', '(\\d+)-(\\d+)', 1);
+---------------------------------------+
|regexp_extract(100-200, (\d+)-(\d+), 1)|
+---------------------------------------+
|                                    100|
+---------------------------------------+
-- regexp_extract_all
SELECT regexp_extract_all('100-200, 300-400', '(\\d+)-(\\d+)', 1);
+----------------------------------------------------+
|regexp_extract_all(100-200, 300-400, (\d+)-(\d+), 1)|
+----------------------------------------------------+
|                                          [100, 300]|
+----------------------------------------------------+
-- regexp_instr
SELECT regexp_instr('user@opensearch.org', '@[^.]*');
+----------------------------------------------+
|regexp_instr(user@opensearch.org, @[^.]*, 0)|
+----------------------------------------------+
|                                             5|
+----------------------------------------------+
-- regexp_replace
SELECT regexp_replace('100-200', '(\\d+)', 'num');
+--------------------------------------+
|regexp_replace(100-200, (\d+), num, 1)|
+--------------------------------------+
|                               num-num|
+--------------------------------------+
-- regexp_substr
SELECT regexp_substr('Steven Jones and Stephen Smith are the best players', 'Ste(v|ph)en');
+-------------------------------------------------------------------------------+
|regexp_substr(Steven Jones and Stephen Smith are the best players, Ste(v|ph)en)|
+-------------------------------------------------------------------------------+
|                                                                         Steven|
+-------------------------------------------------------------------------------+
SELECT regexp_substr('Steven Jones and Stephen Smith are the best players', 'Jeck');
+------------------------------------------------------------------------+
|regexp_substr(Steven Jones and Stephen Smith are the best players, Jeck)|
+------------------------------------------------------------------------+
|                                                                    NULL|
+------------------------------------------------------------------------+
-- repeat
SELECT repeat('123', 2);
+--------------+
|repeat(123, 2)|
+--------------+
|        123123|
+--------------+
-- replace
SELECT replace('ABCabc', 'abc', 'DEF');
+-------------------------+
|replace(ABCabc, abc, DEF)|
+-------------------------+
|                   ABCDEF|
+-------------------------+
-- right
SELECT right('Feathers', 3);
+-------------------+
|right(Feathers, 3)|
+-------------------+
|                ers|
+-------------------+
-- rpad
SELECT rpad('hi', 5, '??');
+---------------+
|rpad(hi, 5, ??)|
+---------------+
|          hi???|
+---------------+
SELECT rpad('hi', 1, '??');
+---------------+
|rpad(hi, 1, ??)|
+---------------+
|              h|
+---------------+
SELECT rpad('hi', 5);
+--------------+
|rpad(hi, 5,  )|
+--------------+
|         hi   |
+--------------+
SELECT hex(rpad(unhex('aabb'), 5));
+--------------------------------+
|hex(rpad(unhex(aabb), 5, X'00'))|
+--------------------------------+
|                      AABB000000|
+--------------------------------+
SELECT hex(rpad(unhex('aabb'), 5, unhex('1122')));
+--------------------------------------+
|hex(rpad(unhex(aabb), 5, unhex(1122)))|
+--------------------------------------+
|                            AABB112211|
+--------------------------------------+
-- rtrim
SELECT rtrim('    Feathers   ');
+----------------------+
|rtrim(    Feathers   )|
+----------------------+
|              Feathers|
+----------------------+
-- sentences
SELECT sentences('Hi there! Good morning.');
+--------------------------------------+
|sentences(Hi there! Good morning., , )|
+--------------------------------------+
|                  [[Hi, there], [Go...|
+--------------------------------------+
-- soundex
SELECT soundex('Miller');
+---------------+
|soundex(Miller)|
+---------------+
|           M460|
+---------------+
-- space
SELECT concat(space(2), '1');
+-------------------+
|concat(space(2), 1)|
+-------------------+
|                  1|
+-------------------+
-- split
SELECT split('oneAtwoBthreeC', '[ABC]');
+--------------------------------+
|split(oneAtwoBthreeC, [ABC], -1)|
+--------------------------------+
|             [one, two, three, ]|
+--------------------------------+
SELECT split('oneAtwoBthreeC', '[ABC]', -1);
+--------------------------------+
|split(oneAtwoBthreeC, [ABC], -1)|
+--------------------------------+
|             [one, two, three, ]|
+--------------------------------+
SELECT split('oneAtwoBthreeC', '[ABC]', 2);
+-------------------------------+
|split(oneAtwoBthreeC, [ABC], 2)|
+-------------------------------+
|              [one, twoBthreeC]|
+-------------------------------+
-- split_part
SELECT split_part('11.12.13', '.', 3);
+--------------------------+
|split_part(11.12.13, ., 3)|
+--------------------------+
|                        13|
+--------------------------+
-- startswith
SELECT startswith('Feathers', 'Fea');
+----------------------------+
|startswith(Feathers, Fea)|
+----------------------------+
|                        true|
+----------------------------+
SELECT startswith('Feathers', 'SQL');
+--------------------------+
|startswith(Feathers, SQL)|
+--------------------------+
|                     false|
+--------------------------+
SELECT startswith('Feathers', null);
+---------------------------+
|startswith(Feathers, NULL)|
+---------------------------+
|                       NULL|
+---------------------------+
SELECT startswith(x'537061726b2053514c', x'537061726b');
+------------------------------------------------+
|startswith(X'537061726B2053514C', X'537061726B')|
+------------------------------------------------+
|                                            true|
+------------------------------------------------+
SELECT startswith(x'537061726b2053514c', x'53514c');
+--------------------------------------------+
|startswith(X'537061726B2053514C', X'53514C')|
+--------------------------------------------+
|                                       false|
+--------------------------------------------+
-- substr
SELECT substr('Feathers', 5);
+--------------------------------+
|substr(Feathers, 5, 2147483647)|
+--------------------------------+
|                           hers |
+--------------------------------+
SELECT substr('Feathers', -3);
+---------------------------------+
|substr(Feathers, -3, 2147483647)|
+---------------------------------+
|                              ers|
+---------------------------------+
SELECT substr('Feathers', 5, 1);
+-----------------------+
|substr(Feathers, 5, 1)|
+-----------------------+
|                      h|
+-----------------------+
SELECT substr('Feathers' FROM 5);
+-----------------------------------+
|substring(Feathers, 5, 2147483647)|
+-----------------------------------+
|                              hers |
+-----------------------------------+
SELECT substr('Feathers' FROM -3);
+------------------------------------+
|substring(Feathers, -3, 2147483647)|
+------------------------------------+
|                                 ers|
+------------------------------------+
SELECT substr('Feathers' FROM 5 FOR 1);
+--------------------------+
|substring(Feathers, 5, 1)|
+--------------------------+
|                         h|
+--------------------------+
-- substring
SELECT substring('Feathers', 5);
+-----------------------------------+
|substring(Feathers, 5, 2147483647)|
+-----------------------------------+
|                              hers |
+-----------------------------------+
SELECT substring('Feathers', -3);
+------------------------------------+
|substring(Feathers, -3, 2147483647)|
+------------------------------------+
|                                 ers|
+------------------------------------+
SELECT substring('Feathers', 5, 1);
+--------------------------+
|substring(Feathers, 5, 1)|
+--------------------------+
|                         h|
+--------------------------+
SELECT substring('Feathers' FROM 5);
+-----------------------------------+
|substring(Feathers, 5, 2147483647)|
+-----------------------------------+
|                              hers |
+-----------------------------------+
SELECT substring('Feathers' FROM -3);
+------------------------------------+
|substring(Feathers, -3, 2147483647)|
+------------------------------------+
|                                 ers|
+------------------------------------+
SELECT substring('Feathers' FROM 5 FOR 1);
+--------------------------+
|substring(Feathers, 5, 1)|
+--------------------------+
|                         h|
+--------------------------+
-- substring_index
SELECT substring_index('www.apache.org', '.', 2);
+-------------------------------------+
|substring_index(www.apache.org, ., 2)|
+-------------------------------------+
|                           www.apache|
+-------------------------------------+
-- to_binary
SELECT to_binary('abc', 'utf-8');
+---------------------+
|to_binary(abc, utf-8)|
+---------------------+
|           [61 62 63]|
+---------------------+
-- to_char
SELECT to_char(454, '999');
+-----------------+
|to_char(454, 999)|
+-----------------+
|              454|
+-----------------+
SELECT to_char(454.00, '000D00');
+-----------------------+
|to_char(454.00, 000D00)|
+-----------------------+
|                 454.00|
+-----------------------+
SELECT to_char(12454, '99G999');
+----------------------+
|to_char(12454, 99G999)|
+----------------------+
|                12,454|
+----------------------+
SELECT to_char(78.12, '$99.99');
+----------------------+
|to_char(78.12, $99.99)|
+----------------------+
|                $78.12|
+----------------------+
SELECT to_char(-12454.8, '99G999D9S');
+----------------------------+
|to_char(-12454.8, 99G999D9S)|
+----------------------------+
|                   12,454.8-|
+----------------------------+
-- to_number
SELECT to_number('454', '999');
+-------------------+
|to_number(454, 999)|
+-------------------+
|                454|
+-------------------+
SELECT to_number('454.00', '000.00');
+-------------------------+
|to_number(454.00, 000.00)|
+-------------------------+
|                   454.00|
+-------------------------+
SELECT to_number('12,454', '99,999');
+-------------------------+
|to_number(12,454, 99,999)|
+-------------------------+
|                    12454|
+-------------------------+
SELECT to_number('$78.12', '$99.99');
+-------------------------+
|to_number($78.12, $99.99)|
+-------------------------+
|                    78.12|
+-------------------------+
SELECT to_number('12,454.8-', '99,999.9S');
+-------------------------------+
|to_number(12,454.8-, 99,999.9S)|
+-------------------------------+
|                       -12454.8|
+-------------------------------+
-- to_varchar
SELECT to_varchar(454, '999');
+-----------------+
|to_char(454, 999)|
+-----------------+
|              454|
+-----------------+
SELECT to_varchar(454.00, '000D00');
+-----------------------+
|to_char(454.00, 000D00)|
+-----------------------+
|                 454.00|
+-----------------------+
SELECT to_varchar(12454, '99G999');
+----------------------+
|to_char(12454, 99G999)|
+----------------------+
|                12,454|
+----------------------+
SELECT to_varchar(78.12, '$99.99');
+----------------------+
|to_char(78.12, $99.99)|
+----------------------+
|                $78.12|
+----------------------+
SELECT to_varchar(-12454.8, '99G999D9S');
+----------------------------+
|to_char(-12454.8, 99G999D9S)|
+----------------------------+
|                   12,454.8-|
+----------------------------+
-- translate
SELECT translate('AaBbCc', 'abc', '123');
+---------------------------+
|translate(AaBbCc, abc, 123)|
+---------------------------+
|                     A1B2C3|
+---------------------------+
-- try_to_binary
SELECT try_to_binary('abc', 'utf-8');
+-------------------------+
|try_to_binary(abc, utf-8)|
+-------------------------+
|               [61 62 63]|
+-------------------------+
select try_to_binary('a!', 'base64');
+-------------------------+
|try_to_binary(a!, base64)|
+-------------------------+
|                     NULL|
+-------------------------+
select try_to_binary('abc', 'invalidFormat');
+---------------------------------+
|try_to_binary(abc, invalidFormat)|
+---------------------------------+
|                             NULL|
+---------------------------------+
-- try_to_number
SELECT try_to_number('454', '999');
+-----------------------+
|try_to_number(454, 999)|
+-----------------------+
|                    454|
+-----------------------+
SELECT try_to_number('454.00', '000.00');
+-----------------------------+
|try_to_number(454.00, 000.00)|
+-----------------------------+
|                       454.00|
+-----------------------------+
SELECT try_to_number('12,454', '99,999');
+-----------------------------+
|try_to_number(12,454, 99,999)|
+-----------------------------+
|                        12454|
+-----------------------------+
SELECT try_to_number('$78.12', '$99.99');
+-----------------------------+
|try_to_number($78.12, $99.99)|
+-----------------------------+
|                        78.12|
+-----------------------------+
SELECT try_to_number('12,454.8-', '99,999.9S');
+-----------------------------------+
|try_to_number(12,454.8-, 99,999.9S)|
+-----------------------------------+
|                           -12454.8|
+-----------------------------------+
-- ucase
SELECT ucase('Feathers');
+---------------+
|ucase(Feathers)|
+---------------+
|       FEATHERS|
+---------------+
-- unbase64
SELECT unbase64('U3BhcmsgU1FM');
+----------------------+
|unbase64(U3BhcmsgU1FM)|
+----------------------+
|  [53 70 61 72 6B 2...|
+----------------------+
-- upper
SELECT upper('Feathers');
+---------------+
|upper(Feathers)|
+---------------+
|       FEATHERS|
+---------------+
```

#### Fonctions de date et d’heure
<a name="supported-sql-date-time"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).


****  

| Fonction | Description | 
| --- | --- | 
| ajouter\$1mois (date\$1début, num\$1mois) | Renvoie la date num\$1months postérieurestart\$1date. | 
| convert\$1timezone ([SourceTZ,] Targettz, SourceTS) | Convertit l'horodatage sans fuseau horaire sourceTs du fuseau horaire sourceTz en. targetTz | 
| curateur () | Renvoie la date actuelle au début de l'évaluation de la requête. Tous les appels de curdate au sein d'une même requête renvoient la même valeur. | 
| date\$1actuelle () | Renvoie la date actuelle au début de l'évaluation de la requête. Tous les appels de current\$1date au sein d'une même requête renvoient la même valeur. | 
| date\$1actuelle | Renvoie la date actuelle au début de l'évaluation de la requête. | 
| horodatage actuel () | Renvoie l'horodatage actuel au début de l'évaluation de la requête. Tous les appels de current\$1timestamp dans la même requête renvoient la même valeur. | 
| horodatage actuel | Renvoie l'horodatage actuel au début de l'évaluation de la requête. | 
| fuse\$1horaire actuel () | Renvoie le fuseau horaire local de la session en cours. | 
| date\$1add (date\$1début, num\$1jours) | Renvoie la date num\$1days postérieurestart\$1date. | 
| date\$1diff (date de fin, date de début) | Renvoie le nombre de jours compris entre startDate etendDate. | 
| date\$1format (horodatage, fmt) | Convertit timestamp en une valeur de chaîne au format spécifié par le format de datefmt. | 
| date\$1from\$1unix\$1date (jours) | Créez une date à partir du nombre de jours écoulés depuis le 01/01/1970. | 
| date\$1part (champ, source) | Extrait une partie de la source date/timestamp ou de l'intervalle. | 
| date\$1sub (date\$1début, num\$1jours) | Renvoie la date num\$1days antérieurestart\$1date. | 
| date\$1trunc (fmt, ts) | Renvoie l'horodatage ts tronqué selon l'unité spécifiée par le modèle de format. fmt | 
| dateadd (date\$1début, num\$1jours) | Renvoie la date num\$1days postérieurestart\$1date. | 
| datediff (date de fin, date de début) | Renvoie le nombre de jours compris entre startDate etendDate. | 
| datepart (champ, source) | Extrait une partie de la source date/timestamp ou de l'intervalle. | 
| jour (date) | Renvoie le jour du mois correspondant à la date/à l'horodatage. | 
| jour du mois (date) | Renvoie le jour du mois correspondant à la date/à l'horodatage. | 
| jour de la semaine (date) | Renvoie le jour de la semaine pour date/timestamp (1 = dimanche, 2 = lundi,..., 7 = samedi). | 
| jour de l'année (date) | Renvoie le jour de l'année correspondant à la date/à l'horodatage. | 
| extrait (champ DEPUIS la source) | Extrait une partie de la source date/timestamp ou de l'intervalle. | 
| from\$1unixtime (unix\$1time [, fmt]) | Renvoie unix\$1time la valeur spécifiéefmt. | 
| from\$1utc\$1timestamp (horodatage, fuseau horaire) | Avec un horodatage tel que « 2017-07-14 02:40:00.0 », il l'interprète comme une heure en UTC et affiche cette heure sous forme d'horodatage dans le fuseau horaire donné. Par exemple, « GMT\$11 » donnerait « 2017-07-14 03:40:00.0 ». | 
| heure (horodatage) | Renvoie le composant horaire de la chaîne/de l'horodatage. | 
| dernier\$1jour (date) | Renvoie le dernier jour du mois auquel appartient la date. | 
| horodatage local () | Renvoie l'horodatage actuel sans le fuseau horaire au début de l'évaluation de la requête. Tous les appels de localtimestamp au sein d'une même requête renvoient la même valeur. | 
| horodatage local | Renvoie la date et l'heure locales actuelles au fuseau horaire de la session au début de l'évaluation de la requête. | 
| make\$1date (année, mois, jour) | Créez une date à partir des champs de l'année, du mois et du jour.  | 
| make\$1dt\$1interval ([jours [, heures [, minutes [, secondes]]])) | Définissez DayTimeIntervalType la durée en jours, heures, minutes et secondes. | 
| make\$1interval ([années [, mois [, semaines [, jours [, heures [, minutes [, secondes]]]]]])) | Établissez un intervalle à partir des années, des mois, des semaines, des jours, des heures, des minutes et des secondes. | 
| make\$1timestamp (année, mois, jour, heure, min, sec [, fuseau horaire]) | Créez un horodatage à partir des champs de l'année, du mois, du jour, de l'heure, de la minute, de la seconde et du fuseau horaire.  | 
| make\$1timestamp\$1ltz (année, mois, jour, heure, min, sec [, fuseau horaire]) | Créez l'horodatage actuel avec le fuseau horaire local à partir des champs année, mois, jour, heure, min, sec et fuseau horaire. | 
| make\$1timestamp\$1ntz (année, mois, jour, heure, minute, seconde) | Créez une date et une heure locales à partir des champs année, mois, jour, heure, minute et seconde.  | 
| make\$1ym\$1interval ([années [, mois]]) | Faites un intervalle année-mois à partir des années, des mois. | 
| minute (horodatage) | Renvoie la composante minute de la chaîne/de l'horodatage. | 
| mois (date) | Renvoie le composant mensuel de la date/de l'horodatage. | 
| months\$1between (horodatage1, horodatage2 [, arrondOff]) | Si timestamp1 c'est plus tard que celatimestamp2, le résultat est positif. Si timestamp1 et si timestamp2 c'est le même jour du mois, ou si les deux sont le dernier jour du mois, l'heure ne sera pas prise en compte. Sinon, la différence est calculée sur la base de 31 jours par mois et arrondie à 8 chiffres, sauf RoundOff=False. | 
| jour\$1suivant (date de début, jour\$1de\$1semaine) | Renvoie la première date postérieure à la date indiquée start\$1date et nommée comme indiqué. La fonction renvoie NULL si au moins un des paramètres d'entrée est NULL.  | 
| maintenant () | Renvoie l'horodatage actuel au début de l'évaluation de la requête. | 
| trimestre (date) | Renvoie le trimestre de l'année pour la date, dans la plage de 1 à 4. | 
| seconde (horodatage) | Renvoie le deuxième composant de la chaîne/de l'horodatage. | 
| fenêtre\$1session (colonne horaire, durée de l'intervalle) | Génère une fenêtre de session avec un horodatage spécifiant la durée de la colonne et de l'intervalle. Voir « Types de fenêtres temporelles » dans le document du guide du streaming structuré pour des explications détaillées et des exemples. | 
| timestamp\$1micros (microsecondes) | Crée un horodatage à partir du nombre de microsecondes écoulées depuis l'époque UTC. | 
| timestamp\$1millis (millisecondes) | Crée un horodatage à partir du nombre de millisecondes écoulées depuis l'époque UTC. | 
| timestamp\$1seconds (secondes) | Crée un horodatage à partir du nombre de secondes (peut être fractionnaire) depuis l'époque UTC. | 
| to\$1date (date\$1str [, fmt]) | Analyse l'date\$1strexpression avec l'fmtexpression jusqu'à une date. Renvoie une valeur nulle si la saisie n'est pas valide. Par défaut, il suit les règles de casting jusqu'à une date si le fmt est omis. | 
| to\$1timestamp (timestamp\$1str [, fmt]) | Analyse l'timestamp\$1strexpression avec l'fmtexpression selon un horodatage. Renvoie une valeur nulle si la saisie n'est pas valide. Par défaut, il applique les règles de conversion à un horodatage si le fmt est omis.  | 
| to\$1timestamp\$1ltz (timestamp\$1str [, fmt]) | Analyse l'expression associée à l'timestamp\$1strfmtexpression selon un horodatage avec le fuseau horaire local. Renvoie une valeur nulle si la saisie n'est pas valide. Par défaut, il applique les règles de conversion à un horodatage si le fmt est omis. | 
| to\$1timestamp\$1ntz (timestamp\$1str [, fmt]) | Analyse l'expression associée à l'timestamp\$1strfmtexpression selon un horodatage sans fuseau horaire. Renvoie une valeur nulle si la saisie n'est pas valide. Par défaut, il applique les règles de conversion à un horodatage si le fmt est omis. | 
| to\$1unix\$1timestamp (TimeExp [, fmt]) | Renvoie l'horodatage UNIX de l'heure donnée. | 
| to\$1utc\$1timestamp (horodatage, fuseau horaire) | Avec un horodatage tel que « 2017-07-14 02:40:00.0 », il l'interprète comme une heure dans le fuseau horaire donné et affiche cette heure sous forme d'horodatage en UTC. Par exemple, « GMT\$11 » donnerait « 2017-07-14 01:40:00.0 ». | 
| tronc (date, fmt) | Renvoie date la partie horaire du jour tronquée à l'unité spécifiée par le modèle fmt de format. | 
| try\$1to\$1timestamp (timestamp\$1str [, fmt]) | Analyse l'timestamp\$1strexpression avec l'fmtexpression selon un horodatage.  | 
| unix\$1date (date) | Renvoie le nombre de jours écoulés depuis le 01/01/1970. | 
| unix\$1micros (horodatage) | Renvoie le nombre de microsecondes écoulées depuis le 01/01/1970 00:00:00 UTC. | 
| unix\$1millis (horodatage) | Renvoie le nombre de millisecondes écoulées depuis le 01/01/1970 00:00:00 UTC. Tronque les niveaux de précision les plus élevés. | 
| unix\$1seconds (horodatage) | Renvoie le nombre de secondes écoulées depuis le 01/01/1970 à 00:00:00 UTC. Tronque les niveaux de précision les plus élevés. | 
| unix\$1timestamp ([TimeExp [, fmt]]) | Renvoie l'horodatage UNIX de l'heure actuelle ou spécifiée. | 
| jour de la semaine (date) | Renvoie le jour de la semaine pour date/timestamp (0 = lundi, 1 = mardi,..., 6 = dimanche). | 
| semaine de l'année (date) | Renvoie la semaine de l'année à la date donnée. Une semaine est considérée comme commençant un lundi et la semaine 1 est la première semaine de plus de 3 jours. | 
| fenêtre (time\$1column, window\$1duration [, slide\$1duration [, start\$1time]]) | Classez les lignes en une ou plusieurs fenêtres temporelles en fonction d'une colonne spécifiant l'horodatage. Les démarrages de fenêtres sont inclusifs mais les fins de fenêtre sont exclusives. Par exemple, 12:05 sera dans la fenêtre [12:05,12:10) mais pas dans [12:00,12:05). Windows peut prendre en charge une précision de l'ordre de la microseconde. Les fenêtres de l'ordre des mois ne sont pas prises en charge. Reportez-vous à la section « Opérations de fenêtre sur l'heure des événements » dans le document du guide de streaming structuré pour des explications détaillées et des exemples. | 
| window\$1time (window\$1column) | Extrayez la valeur temporelle de time/session la colonne de fenêtre qui peut être utilisée pour la valeur temporelle de l'événement de la fenêtre. L'heure extraite est (window.end - 1), ce qui reflète le fait que les fenêtres d'agrégation ont une limite supérieure exclusive ([start, end)]. Voir « Opérations de fenêtre sur l'heure de l'événement » dans le document du guide de streaming structuré pour des explications détaillées et des exemples. | 
| année (date) | Renvoie la composante annuelle de la date/de l'horodatage. | 

**Exemples**

```
-- add_months
SELECT add_months('2016-08-31', 1);
+-------------------------+
|add_months(2016-08-31, 1)|
+-------------------------+
|               2016-09-30|
+-------------------------+
-- convert_timezone
SELECT convert_timezone('Europe/Brussels', 'America/Los_Angeles', timestamp_ntz'2021-12-06 00:00:00');
+-------------------------------------------------------------------------------------------+
|convert_timezone(Europe/Brussels, America/Los_Angeles, TIMESTAMP_NTZ '2021-12-06 00:00:00')|
+-------------------------------------------------------------------------------------------+
|                                                                        2021-12-05 15:00:00|
+-------------------------------------------------------------------------------------------+
SELECT convert_timezone('Europe/Brussels', timestamp_ntz'2021-12-05 15:00:00');
+------------------------------------------------------------------------------------------+
|convert_timezone(current_timezone(), Europe/Brussels, TIMESTAMP_NTZ '2021-12-05 15:00:00')|
+------------------------------------------------------------------------------------------+
|                                                                       2021-12-05 07:00:00|
+------------------------------------------------------------------------------------------+
-- curdate
SELECT curdate();
+--------------+
|current_date()|
+--------------+
|    2024-02-24|
+--------------+
-- current_date
SELECT current_date();
+--------------+
|current_date()|
+--------------+
|    2024-02-24|
+--------------+
SELECT current_date;
+--------------+
|current_date()|
+--------------+
|    2024-02-24|
+--------------+
-- current_timestamp
SELECT current_timestamp();
+--------------------+
| current_timestamp()|
+--------------------+
|2024-02-24 16:36:...|
+--------------------+
SELECT current_timestamp;
+--------------------+
| current_timestamp()|
+--------------------+
|2024-02-24 16:36:...|
+--------------------+
-- current_timezone
SELECT current_timezone();
+------------------+
|current_timezone()|
+------------------+
|        Asia/Seoul|
+------------------+
-- date_add
SELECT date_add('2016-07-30', 1);
+-----------------------+
|date_add(2016-07-30, 1)|
+-----------------------+
|             2016-07-31|
+-----------------------+
-- date_diff
SELECT date_diff('2009-07-31', '2009-07-30');
+---------------------------------+
|date_diff(2009-07-31, 2009-07-30)|
+---------------------------------+
|                                1|
+---------------------------------+
SELECT date_diff('2009-07-30', '2009-07-31');
+---------------------------------+
|date_diff(2009-07-30, 2009-07-31)|
+---------------------------------+
|                               -1|
+---------------------------------+
-- date_format
SELECT date_format('2016-04-08', 'y');
+--------------------------+
|date_format(2016-04-08, y)|
+--------------------------+
|                      2016|
+--------------------------+
-- date_from_unix_date
SELECT date_from_unix_date(1);
+----------------------+
|date_from_unix_date(1)|
+----------------------+
|            1970-01-02|
+----------------------+
-- date_part
SELECT date_part('YEAR', TIMESTAMP '2019-08-12 01:00:00.123456');
+-------------------------------------------------------+
|date_part(YEAR, TIMESTAMP '2019-08-12 01:00:00.123456')|
+-------------------------------------------------------+
|                                                   2019|
+-------------------------------------------------------+
SELECT date_part('week', timestamp'2019-08-12 01:00:00.123456');
+-------------------------------------------------------+
|date_part(week, TIMESTAMP '2019-08-12 01:00:00.123456')|
+-------------------------------------------------------+
|                                                     33|
+-------------------------------------------------------+
SELECT date_part('doy', DATE'2019-08-12');
+---------------------------------+
|date_part(doy, DATE '2019-08-12')|
+---------------------------------+
|                              224|
+---------------------------------+
SELECT date_part('SECONDS', timestamp'2019-10-01 00:00:01.000001');
+----------------------------------------------------------+
|date_part(SECONDS, TIMESTAMP '2019-10-01 00:00:01.000001')|
+----------------------------------------------------------+
|                                                  1.000001|
+----------------------------------------------------------+
SELECT date_part('days', interval 5 days 3 hours 7 minutes);
+-------------------------------------------------+
|date_part(days, INTERVAL '5 03:07' DAY TO MINUTE)|
+-------------------------------------------------+
|                                                5|
+-------------------------------------------------+
SELECT date_part('seconds', interval 5 hours 30 seconds 1 milliseconds 1 microseconds);
+-------------------------------------------------------------+
|date_part(seconds, INTERVAL '05:00:30.001001' HOUR TO SECOND)|
+-------------------------------------------------------------+
|                                                    30.001001|
+-------------------------------------------------------------+
SELECT date_part('MONTH', INTERVAL '2021-11' YEAR TO MONTH);
+--------------------------------------------------+
|date_part(MONTH, INTERVAL '2021-11' YEAR TO MONTH)|
+--------------------------------------------------+
|                                                11|
+--------------------------------------------------+
SELECT date_part('MINUTE', INTERVAL '123 23:55:59.002001' DAY TO SECOND);
+---------------------------------------------------------------+
|date_part(MINUTE, INTERVAL '123 23:55:59.002001' DAY TO SECOND)|
+---------------------------------------------------------------+
|                                                             55|
+---------------------------------------------------------------+
-- date_sub
SELECT date_sub('2016-07-30', 1);
+-----------------------+
|date_sub(2016-07-30, 1)|
+-----------------------+
|             2016-07-29|
+-----------------------+
-- date_trunc
SELECT date_trunc('YEAR', '2015-03-05T09:32:05.359');
+-----------------------------------------+
|date_trunc(YEAR, 2015-03-05T09:32:05.359)|
+-----------------------------------------+
|                      2015-01-01 00:00:00|
+-----------------------------------------+
SELECT date_trunc('MM', '2015-03-05T09:32:05.359');
+---------------------------------------+
|date_trunc(MM, 2015-03-05T09:32:05.359)|
+---------------------------------------+
|                    2015-03-01 00:00:00|
+---------------------------------------+
SELECT date_trunc('DD', '2015-03-05T09:32:05.359');
+---------------------------------------+
|date_trunc(DD, 2015-03-05T09:32:05.359)|
+---------------------------------------+
|                    2015-03-05 00:00:00|
+---------------------------------------+
SELECT date_trunc('HOUR', '2015-03-05T09:32:05.359');
+-----------------------------------------+
|date_trunc(HOUR, 2015-03-05T09:32:05.359)|
+-----------------------------------------+
|                      2015-03-05 09:00:00|
+-----------------------------------------+
SELECT date_trunc('MILLISECOND', '2015-03-05T09:32:05.123456');
+---------------------------------------------------+
|date_trunc(MILLISECOND, 2015-03-05T09:32:05.123456)|
+---------------------------------------------------+
|                               2015-03-05 09:32:...|
+---------------------------------------------------+
-- dateadd
SELECT dateadd('2016-07-30', 1);
+-----------------------+
|date_add(2016-07-30, 1)|
+-----------------------+
|             2016-07-31|
+-----------------------+
-- datediff
SELECT datediff('2009-07-31', '2009-07-30');
+--------------------------------+
|datediff(2009-07-31, 2009-07-30)|
+--------------------------------+
|                               1|
+--------------------------------+
SELECT datediff('2009-07-30', '2009-07-31');
+--------------------------------+
|datediff(2009-07-30, 2009-07-31)|
+--------------------------------+
|                              -1|
+--------------------------------+
-- datepart
SELECT datepart('YEAR', TIMESTAMP '2019-08-12 01:00:00.123456');
+----------------------------------------------------------+
|datepart(YEAR FROM TIMESTAMP '2019-08-12 01:00:00.123456')|
+----------------------------------------------------------+
|                                                      2019|
+----------------------------------------------------------+
SELECT datepart('week', timestamp'2019-08-12 01:00:00.123456');
+----------------------------------------------------------+
|datepart(week FROM TIMESTAMP '2019-08-12 01:00:00.123456')|
+----------------------------------------------------------+
|                                                        33|
+----------------------------------------------------------+
SELECT datepart('doy', DATE'2019-08-12');
+------------------------------------+
|datepart(doy FROM DATE '2019-08-12')|
+------------------------------------+
|                                 224|
+------------------------------------+
SELECT datepart('SECONDS', timestamp'2019-10-01 00:00:01.000001');
+-------------------------------------------------------------+
|datepart(SECONDS FROM TIMESTAMP '2019-10-01 00:00:01.000001')|
+-------------------------------------------------------------+
|                                                     1.000001|
+-------------------------------------------------------------+
SELECT datepart('days', interval 5 days 3 hours 7 minutes);
+----------------------------------------------------+
|datepart(days FROM INTERVAL '5 03:07' DAY TO MINUTE)|
+----------------------------------------------------+
|                                                   5|
+----------------------------------------------------+
SELECT datepart('seconds', interval 5 hours 30 seconds 1 milliseconds 1 microseconds);
+----------------------------------------------------------------+
|datepart(seconds FROM INTERVAL '05:00:30.001001' HOUR TO SECOND)|
+----------------------------------------------------------------+
|                                                       30.001001|
+----------------------------------------------------------------+
SELECT datepart('MONTH', INTERVAL '2021-11' YEAR TO MONTH);
+-----------------------------------------------------+
|datepart(MONTH FROM INTERVAL '2021-11' YEAR TO MONTH)|
+-----------------------------------------------------+
|                                                   11|
+-----------------------------------------------------+
SELECT datepart('MINUTE', INTERVAL '123 23:55:59.002001' DAY TO SECOND);
+------------------------------------------------------------------+
|datepart(MINUTE FROM INTERVAL '123 23:55:59.002001' DAY TO SECOND)|
+------------------------------------------------------------------+
|                                                                55|
+------------------------------------------------------------------+
-- day
SELECT day('2009-07-30');
+---------------+
|day(2009-07-30)|
+---------------+
|             30|
+---------------+
-- dayofmonth
SELECT dayofmonth('2009-07-30');
+----------------------+
|dayofmonth(2009-07-30)|
+----------------------+
|                    30|
+----------------------+
-- dayofweek
SELECT dayofweek('2009-07-30');
+---------------------+
|dayofweek(2009-07-30)|
+---------------------+
|                    5|
+---------------------+
-- dayofyear
SELECT dayofyear('2016-04-09');
+---------------------+
|dayofyear(2016-04-09)|
+---------------------+
|                  100|
+---------------------+
-- extract
SELECT extract(YEAR FROM TIMESTAMP '2019-08-12 01:00:00.123456');
+---------------------------------------------------------+
|extract(YEAR FROM TIMESTAMP '2019-08-12 01:00:00.123456')|
+---------------------------------------------------------+
|                                                     2019|
+---------------------------------------------------------+
SELECT extract(week FROM timestamp'2019-08-12 01:00:00.123456');
+---------------------------------------------------------+
|extract(week FROM TIMESTAMP '2019-08-12 01:00:00.123456')|
+---------------------------------------------------------+
|                                                       33|
+---------------------------------------------------------+
SELECT extract(doy FROM DATE'2019-08-12');
+-----------------------------------+
|extract(doy FROM DATE '2019-08-12')|
+-----------------------------------+
|                                224|
+-----------------------------------+
SELECT extract(SECONDS FROM timestamp'2019-10-01 00:00:01.000001');
+------------------------------------------------------------+
|extract(SECONDS FROM TIMESTAMP '2019-10-01 00:00:01.000001')|
+------------------------------------------------------------+
|                                                    1.000001|
+------------------------------------------------------------+
SELECT extract(days FROM interval 5 days 3 hours 7 minutes);
+---------------------------------------------------+
|extract(days FROM INTERVAL '5 03:07' DAY TO MINUTE)|
+---------------------------------------------------+
|                                                  5|
+---------------------------------------------------+
SELECT extract(seconds FROM interval 5 hours 30 seconds 1 milliseconds 1 microseconds);
+---------------------------------------------------------------+
|extract(seconds FROM INTERVAL '05:00:30.001001' HOUR TO SECOND)|
+---------------------------------------------------------------+
|                                                      30.001001|
+---------------------------------------------------------------+
SELECT extract(MONTH FROM INTERVAL '2021-11' YEAR TO MONTH);
+----------------------------------------------------+
|extract(MONTH FROM INTERVAL '2021-11' YEAR TO MONTH)|
+----------------------------------------------------+
|                                                  11|
+----------------------------------------------------+
SELECT extract(MINUTE FROM INTERVAL '123 23:55:59.002001' DAY TO SECOND);
+-----------------------------------------------------------------+
|extract(MINUTE FROM INTERVAL '123 23:55:59.002001' DAY TO SECOND)|
+-----------------------------------------------------------------+
|                                                               55|
+-----------------------------------------------------------------+
-- from_unixtime
SELECT from_unixtime(0, 'yyyy-MM-dd HH:mm:ss');
+-------------------------------------+
|from_unixtime(0, yyyy-MM-dd HH:mm:ss)|
+-------------------------------------+
|                  1970-01-01 09:00:00|
+-------------------------------------+
SELECT from_unixtime(0);
+-------------------------------------+
|from_unixtime(0, yyyy-MM-dd HH:mm:ss)|
+-------------------------------------+
|                  1970-01-01 09:00:00|
+-------------------------------------+
-- from_utc_timestamp
SELECT from_utc_timestamp('2016-08-31', 'Asia/Seoul');
+------------------------------------------+
|from_utc_timestamp(2016-08-31, Asia/Seoul)|
+------------------------------------------+
|                       2016-08-31 09:00:00|
+------------------------------------------+
-- hour
SELECT hour('2009-07-30 12:58:59');
+-------------------------+
|hour(2009-07-30 12:58:59)|
+-------------------------+
|                       12|
+-------------------------+
-- last_day
SELECT last_day('2009-01-12');
+--------------------+
|last_day(2009-01-12)|
+--------------------+
|          2009-01-31|
+--------------------+
-- localtimestamp
SELECT localtimestamp();
+--------------------+
|    localtimestamp()|
+--------------------+
|2024-02-24 16:36:...|
+--------------------+
-- make_date
SELECT make_date(2013, 7, 15);
+----------------------+
|make_date(2013, 7, 15)|
+----------------------+
|            2013-07-15|
+----------------------+
SELECT make_date(2019, 7, NULL);
+------------------------+
|make_date(2019, 7, NULL)|
+------------------------+
|                    NULL|
+------------------------+
-- make_dt_interval
SELECT make_dt_interval(1, 12, 30, 01.001001);
+-------------------------------------+
|make_dt_interval(1, 12, 30, 1.001001)|
+-------------------------------------+
|                 INTERVAL '1 12:30...|
+-------------------------------------+
SELECT make_dt_interval(2);
+-----------------------------------+
|make_dt_interval(2, 0, 0, 0.000000)|
+-----------------------------------+
|               INTERVAL '2 00:00...|
+-----------------------------------+
SELECT make_dt_interval(100, null, 3);
+----------------------------------------+
|make_dt_interval(100, NULL, 3, 0.000000)|
+----------------------------------------+
|                                    NULL|
+----------------------------------------+
-- make_interval
SELECT make_interval(100, 11, 1, 1, 12, 30, 01.001001);
+----------------------------------------------+
|make_interval(100, 11, 1, 1, 12, 30, 1.001001)|
+----------------------------------------------+
|                          100 years 11 mont...|
+----------------------------------------------+
SELECT make_interval(100, null, 3);
+----------------------------------------------+
|make_interval(100, NULL, 3, 0, 0, 0, 0.000000)|
+----------------------------------------------+
|                                          NULL|
+----------------------------------------------+
SELECT make_interval(0, 1, 0, 1, 0, 0, 100.000001);
+-------------------------------------------+
|make_interval(0, 1, 0, 1, 0, 0, 100.000001)|
+-------------------------------------------+
|                       1 months 1 days 1...|
+-------------------------------------------+
-- make_timestamp
SELECT make_timestamp(2014, 12, 28, 6, 30, 45.887);
+-------------------------------------------+
|make_timestamp(2014, 12, 28, 6, 30, 45.887)|
+-------------------------------------------+
|                       2014-12-28 06:30:...|
+-------------------------------------------+
SELECT make_timestamp(2014, 12, 28, 6, 30, 45.887, 'CET');
+------------------------------------------------+
|make_timestamp(2014, 12, 28, 6, 30, 45.887, CET)|
+------------------------------------------------+
|                            2014-12-28 14:30:...|
+------------------------------------------------+
SELECT make_timestamp(2019, 6, 30, 23, 59, 60);
+---------------------------------------+
|make_timestamp(2019, 6, 30, 23, 59, 60)|
+---------------------------------------+
|                    2019-07-01 00:00:00|
+---------------------------------------+
SELECT make_timestamp(2019, 6, 30, 23, 59, 1);
+--------------------------------------+
|make_timestamp(2019, 6, 30, 23, 59, 1)|
+--------------------------------------+
|                   2019-06-30 23:59:01|
+--------------------------------------+
SELECT make_timestamp(null, 7, 22, 15, 30, 0);
+--------------------------------------+
|make_timestamp(NULL, 7, 22, 15, 30, 0)|
+--------------------------------------+
|                                  NULL|
+--------------------------------------+
-- make_timestamp_ltz
SELECT make_timestamp_ltz(2014, 12, 28, 6, 30, 45.887);
+-----------------------------------------------+
|make_timestamp_ltz(2014, 12, 28, 6, 30, 45.887)|
+-----------------------------------------------+
|                           2014-12-28 06:30:...|
+-----------------------------------------------+
SELECT make_timestamp_ltz(2014, 12, 28, 6, 30, 45.887, 'CET');
+----------------------------------------------------+
|make_timestamp_ltz(2014, 12, 28, 6, 30, 45.887, CET)|
+----------------------------------------------------+
|                                2014-12-28 14:30:...|
+----------------------------------------------------+
SELECT make_timestamp_ltz(2019, 6, 30, 23, 59, 60);
+-------------------------------------------+
|make_timestamp_ltz(2019, 6, 30, 23, 59, 60)|
+-------------------------------------------+
|                        2019-07-01 00:00:00|
+-------------------------------------------+
SELECT make_timestamp_ltz(null, 7, 22, 15, 30, 0);
+------------------------------------------+
|make_timestamp_ltz(NULL, 7, 22, 15, 30, 0)|
+------------------------------------------+
|                                      NULL|
+------------------------------------------+
-- make_timestamp_ntz
SELECT make_timestamp_ntz(2014, 12, 28, 6, 30, 45.887);
+-----------------------------------------------+
|make_timestamp_ntz(2014, 12, 28, 6, 30, 45.887)|
+-----------------------------------------------+
|                           2014-12-28 06:30:...|
+-----------------------------------------------+
SELECT make_timestamp_ntz(2019, 6, 30, 23, 59, 60);
+-------------------------------------------+
|make_timestamp_ntz(2019, 6, 30, 23, 59, 60)|
+-------------------------------------------+
|                        2019-07-01 00:00:00|
+-------------------------------------------+
SELECT make_timestamp_ntz(null, 7, 22, 15, 30, 0);
+------------------------------------------+
|make_timestamp_ntz(NULL, 7, 22, 15, 30, 0)|
+------------------------------------------+
|                                      NULL|
+------------------------------------------+
-- make_ym_interval
SELECT make_ym_interval(1, 2);
+----------------------+
|make_ym_interval(1, 2)|
+----------------------+
|  INTERVAL '1-2' YE...|
+----------------------+
SELECT make_ym_interval(1, 0);
+----------------------+
|make_ym_interval(1, 0)|
+----------------------+
|  INTERVAL '1-0' YE...|
+----------------------+
SELECT make_ym_interval(-1, 1);
+-----------------------+
|make_ym_interval(-1, 1)|
+-----------------------+
|   INTERVAL '-0-11' ...|
+-----------------------+
SELECT make_ym_interval(2);
+----------------------+
|make_ym_interval(2, 0)|
+----------------------+
|  INTERVAL '2-0' YE...|
+----------------------+
-- minute
SELECT minute('2009-07-30 12:58:59');
+---------------------------+
|minute(2009-07-30 12:58:59)|
+---------------------------+
|                         58|
+---------------------------+
-- month
SELECT month('2016-07-30');
+-----------------+
|month(2016-07-30)|
+-----------------+
|                7|
+-----------------+
-- months_between
SELECT months_between('1997-02-28 10:30:00', '1996-10-30');
+-----------------------------------------------------+
|months_between(1997-02-28 10:30:00, 1996-10-30, true)|
+-----------------------------------------------------+
|                                           3.94959677|
+-----------------------------------------------------+
SELECT months_between('1997-02-28 10:30:00', '1996-10-30', false);
+------------------------------------------------------+
|months_between(1997-02-28 10:30:00, 1996-10-30, false)|
+------------------------------------------------------+
|                                    3.9495967741935485|
+------------------------------------------------------+
-- next_day
SELECT next_day('2015-01-14', 'TU');
+------------------------+
|next_day(2015-01-14, TU)|
+------------------------+
|              2015-01-20|
+------------------------+
-- now
SELECT now();
+--------------------+
|               now()|
+--------------------+
|2024-02-24 16:36:...|
+--------------------+
-- quarter
SELECT quarter('2016-08-31');
+-------------------+
|quarter(2016-08-31)|
+-------------------+
|                  3|
+-------------------+
-- second
SELECT second('2009-07-30 12:58:59');
+---------------------------+
|second(2009-07-30 12:58:59)|
+---------------------------+
|                         59|
+---------------------------+
-- session_window
SELECT a, session_window.start, session_window.end, count(*) as cnt FROM VALUES ('A1', '2021-01-01 00:00:00'), ('A1', '2021-01-01 00:04:30'), ('A1', '2021-01-01 00:10:00'), ('A2', '2021-01-01 00:01:00') AS tab(a, b) GROUP by a, session_window(b, '5 minutes') ORDER BY a, start;
+---+-------------------+-------------------+---+
|  a|              start|                end|cnt|
+---+-------------------+-------------------+---+
| A1|2021-01-01 00:00:00|2021-01-01 00:09:30|  2|
| A1|2021-01-01 00:10:00|2021-01-01 00:15:00|  1|
| A2|2021-01-01 00:01:00|2021-01-01 00:06:00|  1|
+---+-------------------+-------------------+---+
SELECT a, session_window.start, session_window.end, count(*) as cnt FROM VALUES ('A1', '2021-01-01 00:00:00'), ('A1', '2021-01-01 00:04:30'), ('A1', '2021-01-01 00:10:00'), ('A2', '2021-01-01 00:01:00'), ('A2', '2021-01-01 00:04:30') AS tab(a, b) GROUP by a, session_window(b, CASE WHEN a = 'A1' THEN '5 minutes' WHEN a = 'A2' THEN '1 minute' ELSE '10 minutes' END) ORDER BY a, start;
+---+-------------------+-------------------+---+
|  a|              start|                end|cnt|
+---+-------------------+-------------------+---+
| A1|2021-01-01 00:00:00|2021-01-01 00:09:30|  2|
| A1|2021-01-01 00:10:00|2021-01-01 00:15:00|  1|
| A2|2021-01-01 00:01:00|2021-01-01 00:02:00|  1|
| A2|2021-01-01 00:04:30|2021-01-01 00:05:30|  1|
+---+-------------------+-------------------+---+
-- timestamp_micros
SELECT timestamp_micros(1230219000123123);
+----------------------------------+
|timestamp_micros(1230219000123123)|
+----------------------------------+
|              2008-12-26 00:30:...|
+----------------------------------+
-- timestamp_millis
SELECT timestamp_millis(1230219000123);
+-------------------------------+
|timestamp_millis(1230219000123)|
+-------------------------------+
|           2008-12-26 00:30:...|
+-------------------------------+
-- timestamp_seconds
SELECT timestamp_seconds(1230219000);
+-----------------------------+
|timestamp_seconds(1230219000)|
+-----------------------------+
|          2008-12-26 00:30:00|
+-----------------------------+
SELECT timestamp_seconds(1230219000.123);
+---------------------------------+
|timestamp_seconds(1230219000.123)|
+---------------------------------+
|             2008-12-26 00:30:...|
+---------------------------------+
-- to_date
SELECT to_date('2009-07-30 04:17:52');
+----------------------------+
|to_date(2009-07-30 04:17:52)|
+----------------------------+
|                  2009-07-30|
+----------------------------+
SELECT to_date('2016-12-31', 'yyyy-MM-dd');
+-------------------------------+
|to_date(2016-12-31, yyyy-MM-dd)|
+-------------------------------+
|                     2016-12-31|
+-------------------------------+
-- to_timestamp
SELECT to_timestamp('2016-12-31 00:12:00');
+---------------------------------+
|to_timestamp(2016-12-31 00:12:00)|
+---------------------------------+
|              2016-12-31 00:12:00|
+---------------------------------+
SELECT to_timestamp('2016-12-31', 'yyyy-MM-dd');
+------------------------------------+
|to_timestamp(2016-12-31, yyyy-MM-dd)|
+------------------------------------+
|                 2016-12-31 00:00:00|
+------------------------------------+
-- to_timestamp_ltz
SELECT to_timestamp_ltz('2016-12-31 00:12:00');
+-------------------------------------+
|to_timestamp_ltz(2016-12-31 00:12:00)|
+-------------------------------------+
|                  2016-12-31 00:12:00|
+-------------------------------------+
SELECT to_timestamp_ltz('2016-12-31', 'yyyy-MM-dd');
+----------------------------------------+
|to_timestamp_ltz(2016-12-31, yyyy-MM-dd)|
+----------------------------------------+
|                     2016-12-31 00:00:00|
+----------------------------------------+
-- to_timestamp_ntz
SELECT to_timestamp_ntz('2016-12-31 00:12:00');
+-------------------------------------+
|to_timestamp_ntz(2016-12-31 00:12:00)|
+-------------------------------------+
|                  2016-12-31 00:12:00|
+-------------------------------------+
SELECT to_timestamp_ntz('2016-12-31', 'yyyy-MM-dd');
+----------------------------------------+
|to_timestamp_ntz(2016-12-31, yyyy-MM-dd)|
+----------------------------------------+
|                     2016-12-31 00:00:00|
+----------------------------------------+
-- to_unix_timestamp
SELECT to_unix_timestamp('2016-04-08', 'yyyy-MM-dd');
+-----------------------------------------+
|to_unix_timestamp(2016-04-08, yyyy-MM-dd)|
+-----------------------------------------+
|                               1460041200|
+-----------------------------------------+
-- to_utc_timestamp
SELECT to_utc_timestamp('2016-08-31', 'Asia/Seoul');
+----------------------------------------+
|to_utc_timestamp(2016-08-31, Asia/Seoul)|
+----------------------------------------+
|                     2016-08-30 15:00:00|
+----------------------------------------+
-- trunc
SELECT trunc('2019-08-04', 'week');
+-----------------------+
|trunc(2019-08-04, week)|
+-----------------------+
|             2019-07-29|
+-----------------------+
SELECT trunc('2019-08-04', 'quarter');
+--------------------------+
|trunc(2019-08-04, quarter)|
+--------------------------+
|                2019-07-01|
+--------------------------+
SELECT trunc('2009-02-12', 'MM');
+---------------------+
|trunc(2009-02-12, MM)|
+---------------------+
|           2009-02-01|
+---------------------+
SELECT trunc('2015-10-27', 'YEAR');
+-----------------------+
|trunc(2015-10-27, YEAR)|
+-----------------------+
|             2015-01-01|
+-----------------------+
-- try_to_timestamp
SELECT try_to_timestamp('2016-12-31 00:12:00');
+-------------------------------------+
|try_to_timestamp(2016-12-31 00:12:00)|
+-------------------------------------+
|                  2016-12-31 00:12:00|
+-------------------------------------+
SELECT try_to_timestamp('2016-12-31', 'yyyy-MM-dd');
+----------------------------------------+
|try_to_timestamp(2016-12-31, yyyy-MM-dd)|
+----------------------------------------+
|                     2016-12-31 00:00:00|
+----------------------------------------+
SELECT try_to_timestamp('foo', 'yyyy-MM-dd');
+---------------------------------+
|try_to_timestamp(foo, yyyy-MM-dd)|
+---------------------------------+
|                             NULL|
+---------------------------------+
-- unix_date
SELECT unix_date(DATE("1970-01-02"));
+---------------------+
|unix_date(1970-01-02)|
+---------------------+
|                    1|
+---------------------+
-- unix_micros
SELECT unix_micros(TIMESTAMP('1970-01-01 00:00:01Z'));
+---------------------------------+
|unix_micros(1970-01-01 00:00:01Z)|
+---------------------------------+
|                          1000000|
+---------------------------------+
-- unix_millis
SELECT unix_millis(TIMESTAMP('1970-01-01 00:00:01Z'));
+---------------------------------+
|unix_millis(1970-01-01 00:00:01Z)|
+---------------------------------+
|                             1000|
+---------------------------------+
-- unix_seconds
SELECT unix_seconds(TIMESTAMP('1970-01-01 00:00:01Z'));
+----------------------------------+
|unix_seconds(1970-01-01 00:00:01Z)|
+----------------------------------+
|                                 1|
+----------------------------------+
-- unix_timestamp
SELECT unix_timestamp();
+--------------------------------------------------------+
|unix_timestamp(current_timestamp(), yyyy-MM-dd HH:mm:ss)|
+--------------------------------------------------------+
|                                              1708760216|
+--------------------------------------------------------+
SELECT unix_timestamp('2016-04-08', 'yyyy-MM-dd');
+--------------------------------------+
|unix_timestamp(2016-04-08, yyyy-MM-dd)|
+--------------------------------------+
|                            1460041200|
+--------------------------------------+
-- weekday
SELECT weekday('2009-07-30');
+-------------------+
|weekday(2009-07-30)|
+-------------------+
|                  3|
+-------------------+
-- weekofyear
SELECT weekofyear('2008-02-20');
+----------------------+
|weekofyear(2008-02-20)|
+----------------------+
|                     8|
+----------------------+
-- window
SELECT a, window.start, window.end, count(*) as cnt FROM VALUES ('A1', '2021-01-01 00:00:00'), ('A1', '2021-01-01 00:04:30'), ('A1', '2021-01-01 00:06:00'), ('A2', '2021-01-01 00:01:00') AS tab(a, b) GROUP by a, window(b, '5 minutes') ORDER BY a, start;
+---+-------------------+-------------------+---+
|  a|              start|                end|cnt|
+---+-------------------+-------------------+---+
| A1|2021-01-01 00:00:00|2021-01-01 00:05:00|  2|
| A1|2021-01-01 00:05:00|2021-01-01 00:10:00|  1|
| A2|2021-01-01 00:00:00|2021-01-01 00:05:00|  1|
+---+-------------------+-------------------+---+
SELECT a, window.start, window.end, count(*) as cnt FROM VALUES ('A1', '2021-01-01 00:00:00'), ('A1', '2021-01-01 00:04:30'), ('A1', '2021-01-01 00:06:00'), ('A2', '2021-01-01 00:01:00') AS tab(a, b) GROUP by a, window(b, '10 minutes', '5 minutes') ORDER BY a, start;
+---+-------------------+-------------------+---+
|  a|              start|                end|cnt|
+---+-------------------+-------------------+---+
| A1|2020-12-31 23:55:00|2021-01-01 00:05:00|  2|
| A1|2021-01-01 00:00:00|2021-01-01 00:10:00|  3|
| A1|2021-01-01 00:05:00|2021-01-01 00:15:00|  1|
| A2|2020-12-31 23:55:00|2021-01-01 00:05:00|  1|
| A2|2021-01-01 00:00:00|2021-01-01 00:10:00|  1|
+---+-------------------+-------------------+---+
-- window_time
SELECT a, window.start as start, window.end as end, window_time(window), cnt FROM (SELECT a, window, count(*) as cnt FROM VALUES ('A1', '2021-01-01 00:00:00'), ('A1', '2021-01-01 00:04:30'), ('A1', '2021-01-01 00:06:00'), ('A2', '2021-01-01 00:01:00') AS tab(a, b) GROUP by a, window(b, '5 minutes') ORDER BY a, window.start);
+---+-------------------+-------------------+--------------------+---+
|  a|              start|                end| window_time(window)|cnt|
+---+-------------------+-------------------+--------------------+---+
| A1|2021-01-01 00:00:00|2021-01-01 00:05:00|2021-01-01 00:04:...|  2|
| A1|2021-01-01 00:05:00|2021-01-01 00:10:00|2021-01-01 00:09:...|  1|
| A2|2021-01-01 00:00:00|2021-01-01 00:05:00|2021-01-01 00:04:...|  1|
+---+-------------------+-------------------+--------------------+---+
-- year
SELECT year('2016-07-30');
+----------------+
|year(2016-07-30)|
+----------------+
|            2016|
+----------------+
```

#### Fonctions d’agrégation
<a name="supported-sql-aggregate"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

Les fonctions d'agrégation agissent sur les valeurs des lignes pour effectuer des calculs mathématiques tels que la somme, la moyenne, le comptage, minimum/maximum les valeurs, l'écart type et l'estimation, ainsi que certaines opérations non mathématiques. 

**Syntaxe**

```
aggregate_function(input1 [, input2, ...]) FILTER (WHERE boolean_expression) 
```

**Paramètres **
+ `boolean_expression`- Spécifie toute expression dont le résultat est un booléen de type booléen. Deux expressions ou plus peuvent être combinées à l'aide des opérateurs logiques (AND, OR). 

**Fonctions d'agrégation ordonnées**

Ces fonctions d'agrégation utilisent une syntaxe différente de celle des autres fonctions d'agrégation afin de spécifier une expression (généralement un nom de colonne) permettant de classer les valeurs. 

**Syntaxe**

```
{ PERCENTILE_CONT | PERCENTILE_DISC }(percentile) WITHIN GROUP (ORDER BY { order_by_expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] }) FILTER (WHERE boolean_expression) 
```

**Paramètres **
+ `percentile`- Le percentile de la valeur que vous souhaitez rechercher. Le percentile doit être une constante comprise entre 0,0 et 1,0. 
+ `order_by_expression`- L'expression (généralement un nom de colonne) permettant d'ordonner les valeurs avant de les agréger. 
+ `boolean_expression`- Spécifie toute expression dont le résultat est un booléen de type booléen. Deux expressions ou plus peuvent être combinées à l'aide des opérateurs logiques (AND, OR). 

**Exemples**

```
CREATE OR REPLACE TEMPORARY VIEW basic_pays AS SELECT * FROM VALUES
('Jane Doe','Accounting',8435),
('Akua Mansa','Accounting',9998),
('John Doe','Accounting',8992),
('Juan Li','Accounting',8870),
('Carlos Salazar','Accounting',11472),
('Arnav Desai','Accounting',6627),
('Saanvi Sarkar','IT',8113),
('Shirley Rodriguez','IT',5186),
('Nikki Wolf','Sales',9181),
('Alejandro Rosalez','Sales',9441),
('Nikhil Jayashankar','Sales',6660),
('Richard Roe','Sales',10563),
('Pat Candella','SCM',10449),
('Gerard Hernandez','SCM',6949),
('Pamela Castillo','SCM',11303),
('Paulo Santos','SCM',11798),
('Jorge Souza','SCM',10586)
AS basic_pays(employee_name, department, salary);
SELECT * FROM basic_pays;
+-------------------+----------+------+
|    employee_name  |department|salary|
+-------------------+----------+------+
| Arnav Desai       |Accounting|  6627|
| Jorge Souza       |       SCM| 10586|
| Jane Doe          |Accounting|  8435|
| Nikhil Jayashankar|     Sales|  6660|
| Diego Vanauf      |     Sales| 10563|
| Carlos Salazar    |Accounting| 11472|
| Gerard Hernandez  |       SCM|  6949|
| John Doe          |Accounting|  8992|
| Nikki Wolf        |     Sales|  9181|
| Paulo Santos      |       SCM| 11798|
| Saanvi Sarkar     |        IT|  8113|
| Shirley Rodriguez |        IT|  5186|
| Pat Candella      |       SCM| 10449|
| Akua Mansa        |Accounting|  9998|
| Pamela Castillo   |       SCM| 11303|
| Alejandro Rosalez |     Sales|  9441|
| Juan Li           |Accounting|  8870|
+-------------------+----------+------+
SELECT
department,
percentile_cont(0.25) WITHIN GROUP (ORDER BY salary) AS pc1,
percentile_cont(0.25) WITHIN GROUP (ORDER BY salary) FILTER (WHERE employee_name LIKE '%Bo%') AS pc2,
percentile_cont(0.25) WITHIN GROUP (ORDER BY salary DESC) AS pc3,
percentile_cont(0.25) WITHIN GROUP (ORDER BY salary DESC) FILTER (WHERE employee_name LIKE '%Bo%') AS pc4,
percentile_disc(0.25) WITHIN GROUP (ORDER BY salary) AS pd1,
percentile_disc(0.25) WITHIN GROUP (ORDER BY salary) FILTER (WHERE employee_name LIKE '%Bo%') AS pd2,
percentile_disc(0.25) WITHIN GROUP (ORDER BY salary DESC) AS pd3,
percentile_disc(0.25) WITHIN GROUP (ORDER BY salary DESC) FILTER (WHERE employee_name LIKE '%Bo%') AS pd4
FROM basic_pays
GROUP BY department
ORDER BY department;
+----------+-------+--------+-------+--------+-----+-----+-----+-----+
|department|    pc1|     pc2|    pc3|     pc4|  pd1|  pd2|  pd3|  pd4|
+----------+-------+--------+-------+--------+-----+-----+-----+-----+
|Accounting|8543.75| 7838.25| 9746.5|10260.75| 8435| 6627| 9998|11472|
|        IT|5917.75|    NULL|7381.25|    NULL| 5186| NULL| 8113| NULL|
|     Sales|8550.75|    NULL| 9721.5|    NULL| 6660| NULL|10563| NULL|
|       SCM|10449.0|10786.25|11303.0|11460.75|10449|10449|11303|11798|
+----------+-------+--------+-------+--------+-----+-----+-----+-----+
```

#### Fonctions conditionnelles
<a name="supported-sql-conditional"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).


****  

| Fonction | Description | 
| --- | --- | 
| fusionner (expr1, expr 2,...) | Renvoie le premier argument non nul s'il existe. Null dans le cas contraire. | 
| si (expr1, expr 2, expr 3) | Si expr1 la valeur est vraie, renvoie expr2 ; dans le cas contraire, renvoieexpr3. | 
| ifnull (expr1, expr 2) | Renvoie expr2 si la valeur expr1 est nulle ou expr1 non. | 
| nanvl (expr1, expr 2) | Renvoie expr1 s'il ne s'agit pas de NaN ou expr2 non. | 
| nul (expr 1, expr 2) | Renvoie la valeur nulle si elle expr1 est égale àexpr2, ou expr1 non. | 
| nvl (expr1, expr 2) | Renvoie expr2 si la valeur expr1 est nulle ou expr1 non. | 
| nvl2 (expr1, expr 2, expr 3) | Renvoie expr2 s'expr1il n'est pas nul ou expr3 non. | 
| CAS OÙ EXPR1 PUIS EXPR2 [QUAND EXPR3 PUIS EXPR4] \$1 [ELSE expr5] FIN | When expr1 = true, renvoie expr2 ; sinon when expr3 = true, renvoie expr4 ; sinon renvoieexpr5. | 

**Exemples**

```
-- coalesce
SELECT coalesce(NULL, 1, NULL);
+-----------------------+
|coalesce(NULL, 1, NULL)|
+-----------------------+
|                      1|
+-----------------------+
-- if
SELECT if(1 < 2, 'a', 'b');
+-------------------+
|(IF((1 < 2), a, b))|
+-------------------+
|                  a|
+-------------------+
-- ifnull
SELECT ifnull(NULL, array('2'));
+----------------------+
|ifnull(NULL, array(2))|
+----------------------+
|                   [2]|
+----------------------+
-- nanvl
SELECT nanvl(cast('NaN' as double), 123);
+-------------------------------+
|nanvl(CAST(NaN AS DOUBLE), 123)|
+-------------------------------+
|                          123.0|
+-------------------------------+
-- nullif
SELECT nullif(2, 2);
+------------+
|nullif(2, 2)|
+------------+
|        NULL|
+------------+
-- nvl
SELECT nvl(NULL, array('2'));
+-------------------+
|nvl(NULL, array(2))|
+-------------------+
|                [2]|
+-------------------+
-- nvl2
SELECT nvl2(NULL, 2, 1);
+----------------+
|nvl2(NULL, 2, 1)|
+----------------+
|               1|
+----------------+
-- when
SELECT CASE WHEN 1 > 0 THEN 1 WHEN 2 > 0 THEN 2.0 ELSE 1.2 END;
+-----------------------------------------------------------+
|CASE WHEN (1 > 0) THEN 1 WHEN (2 > 0) THEN 2.0 ELSE 1.2 END|
+-----------------------------------------------------------+
|                                                        1.0|
+-----------------------------------------------------------+
SELECT CASE WHEN 1 < 0 THEN 1 WHEN 2 > 0 THEN 2.0 ELSE 1.2 END;
+-----------------------------------------------------------+
|CASE WHEN (1 < 0) THEN 1 WHEN (2 > 0) THEN 2.0 ELSE 1.2 END|
+-----------------------------------------------------------+
|                                                        2.0|
+-----------------------------------------------------------+
SELECT CASE WHEN 1 < 0 THEN 1 WHEN 2 < 0 THEN 2.0 END;
+--------------------------------------------------+
|CASE WHEN (1 < 0) THEN 1 WHEN (2 < 0) THEN 2.0 END|
+--------------------------------------------------+
|                                              NULL|
+--------------------------------------------------+
```

#### Fonctions JSON
<a name="supported-sql-json"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).




****  

| Fonction | Description | 
| --- | --- | 
| from\$1json (JSONStr, schéma [, options]) | Renvoie une valeur de structure avec le `JSONStr` et le `schema` donnés. | 
| get\$1json\$1object (json\$1txt, chemin) | Extrait un objet JSON de `path`. | 
| json\$1array\$1length (JSONArray) | Renvoie le nombre d'éléments du tableau JSON le plus externe. | 
| json\$1object\$1keys (json\$1object) | Renvoie toutes les clés de l'objet JSON le plus externe sous forme de tableau. | 
| json\$1tuple (JSONStr, p1, p2,..., pn) | Renvoie un tuple comme la fonction get\$1json\$1object, mais il prend plusieurs noms. Tous les paramètres d'entrée et les types de colonnes de sortie sont des chaînes de caractères. | 
| schema\$1of\$1json (json [, options]) | Renvoie le schéma au format DDL d'une chaîne JSON. | 
| to\$1json (expr [, options]) | Renvoie une chaîne JSON avec une valeur de structure donnée | 

**Exemples**

```
-- from_json
SELECT from_json('{"a":1, "b":0.8}', 'a INT, b DOUBLE');
+---------------------------+
| from_json({"a":1, "b":0.8}) |
+---------------------------+
| {1, 0.8}                  |
+---------------------------+

SELECT from_json('{"time":"26/08/2015"}', 'time Timestamp', map('timestampFormat', 'dd/MM/yyyy'));
+--------------------------------+
| from_json({"time":"26/08/2015"}) |
+--------------------------------+
| {2015-08-26 00:00...           |
+--------------------------------+

SELECT from_json('{"teacher": "Alice", "student": [{"name": "Bob", "rank": 1}, {"name": "Charlie", "rank": 2}]}', 'STRUCT<teacher: STRING, student: ARRAY<STRUCT<name: STRING, rank: INT>>>');
+--------------------------------------------------------------------------------------------------------+
| from_json({"teacher": "Alice", "student": [{"name": "Bob", "rank": 1}, {"name": "Charlie", "rank": 2}]}) |
+--------------------------------------------------------------------------------------------------------+
| {Alice, [{Bob, 1}...                                                                                   |
+--------------------------------------------------------------------------------------------------------+

-- get_json_object
SELECT get_json_object('{"a":"b"}', '$.a');
+-------------------------------+
| get_json_object({"a":"b"}, $.a) |
+-------------------------------+
| b                             |
+-------------------------------+

-- json_array_length
SELECT json_array_length('[1,2,3,4]');
+----------------------------+
| json_array_length([1,2,3,4]) |
+----------------------------+
| 4                          |
+----------------------------+

SELECT json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]');
+------------------------------------------------+
| json_array_length([1,2,3,{"f1":1,"f2":[5,6]},4]) |
+------------------------------------------------+
| 5                                              |
+------------------------------------------------+

SELECT json_array_length('[1,2');
+-----------------------+
| json_array_length([1,2) |
+-----------------------+
| NULL                  |
+-----------------------+

-- json_object_keys
SELECT json_object_keys('{}');
+--------------------+
| json_object_keys({}) |
+--------------------+
| []                 |
+--------------------+

SELECT json_object_keys('{"key": "value"}');
+----------------------------------+
| json_object_keys({"key": "value"}) |
+----------------------------------+
| [key]                            |
+----------------------------------+

SELECT json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}');
+--------------------------------------------------------+
| json_object_keys({"f1":"abc","f2":{"f3":"a", "f4":"b"}}) |
+--------------------------------------------------------+
| [f1, f2]                                               |
+--------------------------------------------------------+

-- json_tuple
SELECT json_tuple('{"a":1, "b":2}', 'a', 'b');
+---+---+
| c0| c1|
+---+---+
|  1|  2|
+---+---+

-- schema_of_json
SELECT schema_of_json('[{"col":0}]');
+---------------------------+
| schema_of_json([{"col":0}]) |
+---------------------------+
| ARRAY<STRUCT<col:...      |
+---------------------------+

SELECT schema_of_json('[{"col":01}]', map('allowNumericLeadingZeros', 'true'));
+----------------------------+
| schema_of_json([{"col":01}]) |
+----------------------------+
| ARRAY<STRUCT<col:...       |
+----------------------------+

-- to_json
SELECT to_json(named_struct('a', 1, 'b', 2));
+---------------------------------+
| to_json(named_struct(a, 1, b, 2)) |
+---------------------------------+
| {"a":1,"b":2}                   |
+---------------------------------+

SELECT to_json(named_struct('time', to_timestamp('2015-08-26', 'yyyy-MM-dd')), map('timestampFormat', 'dd/MM/yyyy'));
+-----------------------------------------------------------------+
| to_json(named_struct(time, to_timestamp(2015-08-26, yyyy-MM-dd))) |
+-----------------------------------------------------------------+
| {"time":"26/08/20...                                            |
+-----------------------------------------------------------------+

SELECT to_json(array(named_struct('a', 1, 'b', 2)));
+----------------------------------------+
| to_json(array(named_struct(a, 1, b, 2))) |
+----------------------------------------+
| [{"a":1,"b":2}]                        |
+----------------------------------------+

SELECT to_json(map('a', named_struct('b', 1)));
+-----------------------------------+
| to_json(map(a, named_struct(b, 1))) |
+-----------------------------------+
| {"a":{"b":1}}                     |
+-----------------------------------+

SELECT to_json(map(named_struct('a', 1),named_struct('b', 2)));
+----------------------------------------------------+
| to_json(map(named_struct(a, 1), named_struct(b, 2))) |
+----------------------------------------------------+
| {"[1]":{"b":2}}                                    |
+----------------------------------------------------+

SELECT to_json(map('a', 1));
+------------------+
| to_json(map(a, 1)) |
+------------------+
| {"a":1}          |
+------------------+

SELECT to_json(array(map('a', 1)));
+-------------------------+
| to_json(array(map(a, 1))) |
+-------------------------+
| [{"a":1}]               |
+-------------------------+
```

#### Fonctions de tableau
<a name="supported-sql-array"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).


****  

| Fonction | Description | 
| --- | --- | 
| tableau (expr,...) | Renvoie un tableau avec les éléments donnés. | 
| array\$1append (tableau, élément) | Ajoutez l'élément à la fin du tableau passé en premier argument. Le type d'élément doit être similaire au type des éléments du tableau. L'élément nul est également ajouté au tableau. Mais si le tableau est passé, sa sortie est NULL | 
| array\$1compact (tableau) | Supprime les valeurs nulles du tableau. | 
| array\$1contains (tableau, valeur) | Renvoie vrai si le tableau contient la valeur. | 
| array\$1distinct (tableau) | Supprime les valeurs dupliquées du tableau. | 
| array\$1except (tableau1, tableau2) | Renvoie un tableau des éléments du tableau 1 mais pas du tableau 2, sans doublons. | 
| array\$1insert (x, pos, val) | Place val dans l'index pos du tableau x. Les indices du tableau commencent à 1. L'indice négatif maximal est -1 pour lequel la fonction insère un nouvel élément après le dernier élément actuel. L'index au-dessus de la taille du tableau ajoute le tableau, ou le préfixe si l'indice est négatif, avec des éléments « nuls ». | 
| array\$1intersect (matrice1, matrice2) | Renvoie un tableau des éléments situés à l'intersection de array1 et array2, sans doublons. | 
| array\$1join (tableau, délimiteur [, NullReplacement]) | Concatène les éléments du tableau donné à l'aide du délimiteur et d'une chaîne facultative pour remplacer les valeurs nulles. Si aucune valeur n'est définie pour NullReplacement, toute valeur nulle est filtrée. | 
| array\$1max (tableau) | Renvoie la valeur maximale du tableau. NaN est supérieur à tous les éléments non NaN pour le double/float type. Les éléments NULL sont ignorés. | 
| array\$1min (tableau) | Renvoie la valeur minimale du tableau. NaN est supérieur à tous les éléments non NaN pour le double/float type. Les éléments NULL sont ignorés. | 
| array\$1position (tableau, élément) | Renvoie l'index (basé sur 1) du premier élément correspondant du tableau sous forme longue, ou 0 si aucune correspondance n'est trouvée. | 
| array\$1prepend (tableau, élément) | Ajoutez l'élément au début du tableau passé en premier argument. Le type d'élément doit être le même que le type des éléments du tableau. L'élément nul est également ajouté au tableau. Mais si le tableau transmis est NULL, la sortie est NULL | 
| array\$1remove (tableau, élément) | Supprime tous les éléments égaux à un élément du tableau. | 
| array\$1repeat (élément, nombre) | Renvoie le tableau contenant le nombre de fois où les éléments sont dénombrés. | 
| array\$1union (matrice1, matrice2) | Renvoie un tableau des éléments de l'union de array1 et array2, sans doublons. | 
| arrays\$1overlap (a1, a2) | Renvoie vrai si a1 contient au moins un élément non nul présent également dans a2. Si les tableaux n'ont aucun élément commun, qu'ils ne sont pas vides et que l'un d'eux contient un élément nul, la valeur null est renvoyée, false dans le cas contraire. | 
| tableaux\$1zip (a1, a2,...) | Renvoie un tableau fusionné de structures dans lequel la N-ième structure contient toutes les N-ièmes valeurs des tableaux d'entrée. | 
| aplatir () arrayOfArrays | Transforme un tableau de tableaux en un seul tableau. | 
| obtenir (tableau, index) | Renvoie l'élément du tableau à un index donné (basé sur 0). Si l'index pointe en dehors des limites du tableau, cette fonction renvoie la valeur NULL. | 
| séquence (démarrage, arrêt, étape) | Génère un tableau d'éléments du début à la fin (inclus), en les incrémentant pas à pas. Le type des éléments renvoyés est le même que celui des expressions d'argument. Les types pris en charge sont les suivants : octet, court, entier, long, date, horodatage. Les expressions de début et d'arrêt doivent être résolues dans le même type. Si les expressions de début et de fin sont du type « date » ou « horodatage », l'expression d'étape doit être du type « intervalle », « intervalle année-mois » ou « intervalle jour-heure », sinon du même type que les expressions de début et de fin. | 
| shuffle (tableau) | Renvoie une permutation aléatoire du tableau donné. | 
| tranche (x, début, longueur) | Sous-ensembles le tableau x à partir du début de l'index (les indices du tableau commencent à 1, ou à partir de la fin si le début est négatif) avec la longueur spécifiée. | 
| sort\$1array (tableau [, ordre croissant]) | Trie le tableau d'entrée par ordre croissant ou décroissant selon l'ordre naturel des éléments du tableau. NaN est supérieur à tous les éléments non NaN pour le double/float type. Les éléments nuls seront placés au début du tableau renvoyé par ordre croissant ou à la fin du tableau renvoyé par ordre décroissant. | 

**Exemples**

```
-- array
SELECT array(1, 2, 3);
+--------------+
|array(1, 2, 3)|
+--------------+
|     [1, 2, 3]|
+--------------+
-- array_append
SELECT array_append(array('b', 'd', 'c', 'a'), 'd');
+----------------------------------+
|array_append(array(b, d, c, a), d)|
+----------------------------------+
|                   [b, d, c, a, d]|
+----------------------------------+
SELECT array_append(array(1, 2, 3, null), null);
+----------------------------------------+
|array_append(array(1, 2, 3, NULL), NULL)|
+----------------------------------------+
|                    [1, 2, 3, NULL, N...|
+----------------------------------------+
SELECT array_append(CAST(null as Array<Int>), 2);
+---------------------+
|array_append(NULL, 2)|
+---------------------+
|                 NULL|
+---------------------+
-- array_compact
SELECT array_compact(array(1, 2, 3, null));
+-----------------------------------+
|array_compact(array(1, 2, 3, NULL))|
+-----------------------------------+
|                          [1, 2, 3]|
+-----------------------------------+
SELECT array_compact(array("a", "b", "c"));
+-----------------------------+
|array_compact(array(a, b, c))|
+-----------------------------+
|                    [a, b, c]|
+-----------------------------+
-- array_contains
SELECT array_contains(array(1, 2, 3), 2);
+---------------------------------+
|array_contains(array(1, 2, 3), 2)|
+---------------------------------+
|                             true|
+---------------------------------+
-- array_distinct
SELECT array_distinct(array(1, 2, 3, null, 3));
+---------------------------------------+
|array_distinct(array(1, 2, 3, NULL, 3))|
+---------------------------------------+
|                        [1, 2, 3, NULL]|
+---------------------------------------+
-- array_except
SELECT array_except(array(1, 2, 3), array(1, 3, 5));
+--------------------------------------------+
|array_except(array(1, 2, 3), array(1, 3, 5))|
+--------------------------------------------+
|                                         [2]|
+--------------------------------------------+
-- array_insert
SELECT array_insert(array(1, 2, 3, 4), 5, 5);
+-------------------------------------+
|array_insert(array(1, 2, 3, 4), 5, 5)|
+-------------------------------------+
|                      [1, 2, 3, 4, 5]|
+-------------------------------------+
SELECT array_insert(array(5, 4, 3, 2), -1, 1);
+--------------------------------------+
|array_insert(array(5, 4, 3, 2), -1, 1)|
+--------------------------------------+
|                       [5, 4, 3, 2, 1]|
+--------------------------------------+
SELECT array_insert(array(5, 3, 2, 1), -4, 4);
+--------------------------------------+
|array_insert(array(5, 3, 2, 1), -4, 4)|
+--------------------------------------+
|                       [5, 4, 3, 2, 1]|
+--------------------------------------+
-- array_intersect
SELECT array_intersect(array(1, 2, 3), array(1, 3, 5));
+-----------------------------------------------+
|array_intersect(array(1, 2, 3), array(1, 3, 5))|
+-----------------------------------------------+
|                                         [1, 3]|
+-----------------------------------------------+
-- array_join
SELECT array_join(array('hello', 'world'), ' ');
+----------------------------------+
|array_join(array(hello, world),  )|
+----------------------------------+
|                       hello world|
+----------------------------------+
SELECT array_join(array('hello', null ,'world'), ' ');
+----------------------------------------+
|array_join(array(hello, NULL, world),  )|
+----------------------------------------+
|                             hello world|
+----------------------------------------+
SELECT array_join(array('hello', null ,'world'), ' ', ',');
+-------------------------------------------+
|array_join(array(hello, NULL, world),  , ,)|
+-------------------------------------------+
|                              hello , world|
+-------------------------------------------+
-- array_max
SELECT array_max(array(1, 20, null, 3));
+--------------------------------+
|array_max(array(1, 20, NULL, 3))|
+--------------------------------+
|                              20|
+--------------------------------+
-- array_min
SELECT array_min(array(1, 20, null, 3));
+--------------------------------+
|array_min(array(1, 20, NULL, 3))|
+--------------------------------+
|                               1|
+--------------------------------+
-- array_position
SELECT array_position(array(312, 773, 708, 708), 708);
+----------------------------------------------+
|array_position(array(312, 773, 708, 708), 708)|
+----------------------------------------------+
|                                             3|
+----------------------------------------------+
SELECT array_position(array(312, 773, 708, 708), 414);
+----------------------------------------------+
|array_position(array(312, 773, 708, 708), 414)|
+----------------------------------------------+
|                                             0|
+----------------------------------------------+
-- array_prepend
SELECT array_prepend(array('b', 'd', 'c', 'a'), 'd');
+-----------------------------------+
|array_prepend(array(b, d, c, a), d)|
+-----------------------------------+
|                    [d, b, d, c, a]|
+-----------------------------------+
SELECT array_prepend(array(1, 2, 3, null), null);
+-----------------------------------------+
|array_prepend(array(1, 2, 3, NULL), NULL)|
+-----------------------------------------+
|                     [NULL, 1, 2, 3, N...|
+-----------------------------------------+
SELECT array_prepend(CAST(null as Array<Int>), 2);
+----------------------+
|array_prepend(NULL, 2)|
+----------------------+
|                  NULL|
+----------------------+
-- array_remove
SELECT array_remove(array(1, 2, 3, null, 3), 3);
+----------------------------------------+
|array_remove(array(1, 2, 3, NULL, 3), 3)|
+----------------------------------------+
|                            [1, 2, NULL]|
+----------------------------------------+
-- array_repeat
SELECT array_repeat('123', 2);
+--------------------+
|array_repeat(123, 2)|
+--------------------+
|          [123, 123]|
+--------------------+
-- array_union
SELECT array_union(array(1, 2, 3), array(1, 3, 5));
+-------------------------------------------+
|array_union(array(1, 2, 3), array(1, 3, 5))|
+-------------------------------------------+
|                               [1, 2, 3, 5]|
+-------------------------------------------+
-- arrays_overlap
SELECT arrays_overlap(array(1, 2, 3), array(3, 4, 5));
+----------------------------------------------+
|arrays_overlap(array(1, 2, 3), array(3, 4, 5))|
+----------------------------------------------+
|                                          true|
+----------------------------------------------+
-- arrays_zip
SELECT arrays_zip(array(1, 2, 3), array(2, 3, 4));
+------------------------------------------+
|arrays_zip(array(1, 2, 3), array(2, 3, 4))|
+------------------------------------------+
|                      [{1, 2}, {2, 3}, ...|
+------------------------------------------+
SELECT arrays_zip(array(1, 2), array(2, 3), array(3, 4));
+-------------------------------------------------+
|arrays_zip(array(1, 2), array(2, 3), array(3, 4))|
+-------------------------------------------------+
|                             [{1, 2, 3}, {2, 3...|
+-------------------------------------------------+
-- flatten
SELECT flatten(array(array(1, 2), array(3, 4)));
+----------------------------------------+
|flatten(array(array(1, 2), array(3, 4)))|
+----------------------------------------+
|                            [1, 2, 3, 4]|
+----------------------------------------+
-- get
SELECT get(array(1, 2, 3), 0);
+----------------------+
|get(array(1, 2, 3), 0)|
+----------------------+
|                     1|
+----------------------+
SELECT get(array(1, 2, 3), 3);
+----------------------+
|get(array(1, 2, 3), 3)|
+----------------------+
|                  NULL|
+----------------------+
SELECT get(array(1, 2, 3), -1);
+-----------------------+
|get(array(1, 2, 3), -1)|
+-----------------------+
|                   NULL|
+-----------------------+
-- sequence
SELECT sequence(1, 5);
+---------------+
| sequence(1, 5)|
+---------------+
|[1, 2, 3, 4, 5]|
+---------------+
SELECT sequence(5, 1);
+---------------+
| sequence(5, 1)|
+---------------+
|[5, 4, 3, 2, 1]|
+---------------+
SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 month);
+----------------------------------------------------------------------+
|sequence(to_date(2018-01-01), to_date(2018-03-01), INTERVAL '1' MONTH)|
+----------------------------------------------------------------------+
|                                                  [2018-01-01, 2018...|
+----------------------------------------------------------------------+
SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '0-1' year to month);
+--------------------------------------------------------------------------------+
|sequence(to_date(2018-01-01), to_date(2018-03-01), INTERVAL '0-1' YEAR TO MONTH)|
+--------------------------------------------------------------------------------+
|                                                            [2018-01-01, 2018...|
+--------------------------------------------------------------------------------+
-- shuffle
SELECT shuffle(array(1, 20, 3, 5));
+---------------------------+
|shuffle(array(1, 20, 3, 5))|
+---------------------------+
|              [5, 1, 20, 3]|
+---------------------------+
SELECT shuffle(array(1, 20, null, 3));
+------------------------------+
|shuffle(array(1, 20, NULL, 3))|
+------------------------------+
|              [1, NULL, 20, 3]|
+------------------------------+
-- slice
SELECT slice(array(1, 2, 3, 4), 2, 2);
+------------------------------+
|slice(array(1, 2, 3, 4), 2, 2)|
+------------------------------+
|                        [2, 3]|
+------------------------------+
SELECT slice(array(1, 2, 3, 4), -2, 2);
+-------------------------------+
|slice(array(1, 2, 3, 4), -2, 2)|
+-------------------------------+
|                         [3, 4]|
+-------------------------------+
-- sort_array
SELECT sort_array(array('b', 'd', null, 'c', 'a'), true);
+-----------------------------------------+
|sort_array(array(b, d, NULL, c, a), true)|
+-----------------------------------------+
|                       [NULL, a, b, c, d]|
+-----------------------------------------+
```

#### Fonctions de fenêtrage
<a name="supported-sql-window"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

Les fonctions de fenêtre opèrent sur un groupe de lignes, appelé fenêtre, et calculent une valeur de retour pour chaque ligne en fonction du groupe de lignes. Les fonctions de fenêtre sont utiles pour traiter des tâches telles que le calcul d'une moyenne mobile, le calcul d'une statistique cumulée ou l'accès à la valeur des lignes en fonction de la position relative de la ligne en cours. 

**Syntaxe** 

```
window_function [ nulls_option ] OVER ( [ { PARTITION | DISTRIBUTE } BY partition_col_name = partition_col_val ( [ , ... ] ) ] { ORDER | SORT } BY expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] [ window_frame ] ) 
```

**Paramètres** 
+ 

  fonction\$1fenêtre 

  Fonctions de classement 

  Syntaxe : `RANK | DENSE_RANK | PERCENT_RANK | NTILE | ROW_NUMBER `

  Fonctions analytiques 

  Syntaxe : `CUME_DIST | LAG | LEAD | NTH_VALUE | FIRST_VALUE | LAST_VALUE `

  Fonctions d’agrégation 

  Syntaxe : `MAX | MIN | COUNT | SUM | AVG | ... `
+ `nulls_option`- Spécifie s'il faut ou non ignorer les valeurs nulles lors de l'évaluation de la fonction de fenêtre. RESPECTER LES VALEURS NULLS signifie ne pas ignorer les valeurs nulles, tandis que IGNORER NULLS signifie les ignorer. Si ce n'est pas spécifié, la valeur par défaut est RESPECT NULLS. 

  Syntaxe : `{ IGNORE | RESPECT } NULLS `

  Remarque : `Only LAG` \$1 `LEAD` \$1 `NTH_VALUE` \$1 `FIRST_VALUE` \$1 `LAST_VALUE` peut être utilisé avec`IGNORE NULLS`. 
+ `window_frame`- Spécifie sur quelle ligne commencer la fenêtre et où la terminer. 

  Syntaxe : `{ RANGE | ROWS } { frame_start | BETWEEN frame_start AND frame_end }` 

  frame\$1start et frame\$1end ont la syntaxe suivante : 

  Syntaxe : `UNBOUNDED PRECEDING | offset PRECEDING | CURRENT ROW | offset FOLLOWING | UNBOUNDED FOLLOWING `

  offset : indique le décalage par rapport à la position de la ligne en cours. 

  **Remarque** Si frame\$1end est omis, la valeur par défaut est CURRENT ROW. 

**Exemples**

```
CREATE TABLE employees (name STRING, dept STRING, salary INT, age INT);
INSERT INTO employees VALUES ("Lisa", "Sales", 10000, 35);
INSERT INTO employees VALUES ("Evan", "Sales", 32000, 38);
INSERT INTO employees VALUES ("Fred", "Engineering", 21000, 28);
INSERT INTO employees VALUES ("Alex", "Sales", 30000, 33);
INSERT INTO employees VALUES ("Tom", "Engineering", 23000, 33);
INSERT INTO employees VALUES ("Jane", "Marketing", 29000, 28);
INSERT INTO employees VALUES ("Jeff", "Marketing", 35000, 38);
INSERT INTO employees VALUES ("Paul", "Engineering", 29000, 23);
INSERT INTO employees VALUES ("Chloe", "Engineering", 23000, 25);
SELECT * FROM employees;
+-----+-----------+------+-----+
| name|       dept|salary|  age|
+-----+-----------+------+-----+
|Chloe|Engineering| 23000|   25|
| Fred|Engineering| 21000|   28|
| Paul|Engineering| 29000|   23|
|Helen|  Marketing| 29000|   40|
|  Tom|Engineering| 23000|   33|
| Jane|  Marketing| 29000|   28|
| Jeff|  Marketing| 35000|   38|
| Evan|      Sales| 32000|   38|
| Lisa|      Sales| 10000|   35|
| Alex|      Sales| 30000|   33|
+-----+-----------+------+-----+
SELECT name, dept, salary, RANK() OVER (PARTITION BY dept ORDER BY salary) AS rank FROM employees;
+-----+-----------+------+----+
| name|       dept|salary|rank|
+-----+-----------+------+----+
| Lisa|      Sales| 10000|   1|
| Alex|      Sales| 30000|   2|
| Evan|      Sales| 32000|   3|
| Fred|Engineering| 21000|   1|
|  Tom|Engineering| 23000|   2|
|Chloe|Engineering| 23000|   2|
| Paul|Engineering| 29000|   4|
|Helen|  Marketing| 29000|   1|
| Jane|  Marketing| 29000|   1|
| Jeff|  Marketing| 35000|   3|
+-----+-----------+------+----+
SELECT name, dept, salary, DENSE_RANK() OVER (PARTITION BY dept ORDER BY salary ROWS BETWEEN
UNBOUNDED PRECEDING AND CURRENT ROW) AS dense_rank FROM employees;
+-----+-----------+------+----------+
| name|       dept|salary|dense_rank|
+-----+-----------+------+----------+
| Lisa|      Sales| 10000|         1|
| Alex|      Sales| 30000|         2|
| Evan|      Sales| 32000|         3|
| Fred|Engineering| 21000|         1|
|  Tom|Engineering| 23000|         2|
|Chloe|Engineering| 23000|         2|
| Paul|Engineering| 29000|         3|
|Helen|  Marketing| 29000|         1|
| Jane|  Marketing| 29000|         1|
| Jeff|  Marketing| 35000|         2|
+-----+-----------+------+----------+
SELECT name, dept, age, CUME_DIST() OVER (PARTITION BY dept ORDER BY age
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cume_dist FROM employees;
+-----+-----------+------+------------------+
| name|       dept|age   |         cume_dist|
+-----+-----------+------+------------------+
| Alex|      Sales|    33|0.3333333333333333|
| Lisa|      Sales|    35|0.6666666666666666|
| Evan|      Sales|    38|               1.0|
| Paul|Engineering|    23|              0.25|
|Chloe|Engineering|    25|              0.75|
| Fred|Engineering|    28|              0.25|
|  Tom|Engineering|    33|               1.0|
| Jane|  Marketing|    28|0.3333333333333333|
| Jeff|  Marketing|    38|0.6666666666666666|
|Helen|  Marketing|    40|               1.0|
+-----+-----------+------+------------------+
SELECT name, dept, salary, MIN(salary) OVER (PARTITION BY dept ORDER BY salary) AS min
FROM employees;
+-----+-----------+------+-----+
| name|       dept|salary|  min|
+-----+-----------+------+-----+
| Lisa|      Sales| 10000|10000|
| Alex|      Sales| 30000|10000|
| Evan|      Sales| 32000|10000|
|Helen|  Marketing| 29000|29000|
| Jane|  Marketing| 29000|29000|
| Jeff|  Marketing| 35000|29000|
| Fred|Engineering| 21000|21000|
|  Tom|Engineering| 23000|21000|
|Chloe|Engineering| 23000|21000|
| Paul|Engineering| 29000|21000|
+-----+-----------+------+-----+
SELECT name, salary,
LAG(salary) OVER (PARTITION BY dept ORDER BY salary) AS lag,
LEAD(salary, 1, 0) OVER (PARTITION BY dept ORDER BY salary) AS lead
FROM employees;
+-----+-----------+------+-----+-----+
| name|       dept|salary|  lag| lead|
+-----+-----------+------+-----+-----+
| Lisa|      Sales| 10000|NULL |30000|
| Alex|      Sales| 30000|10000|32000|
| Evan|      Sales| 32000|30000|    0|
| Fred|Engineering| 21000| NULL|23000|
|Chloe|Engineering| 23000|21000|23000|
|  Tom|Engineering| 23000|23000|29000|
| Paul|Engineering| 29000|23000|    0|
|Helen|  Marketing| 29000| NULL|29000|
| Jane|  Marketing| 29000|29000|35000|
| Jeff|  Marketing| 35000|29000|    0|
+-----+-----------+------+-----+-----+
SELECT id, v,
LEAD(v, 0) IGNORE NULLS OVER w lead,
LAG(v, 0) IGNORE NULLS OVER w lag,
NTH_VALUE(v, 2) IGNORE NULLS OVER w nth_value,
FIRST_VALUE(v) IGNORE NULLS OVER w first_value,
LAST_VALUE(v) IGNORE NULLS OVER w last_value
FROM test_ignore_null
WINDOW w AS (ORDER BY id)
ORDER BY id;
+--+----+----+----+---------+-----------+----------+
|id|   v|lead| lag|nth_value|first_value|last_value|
+--+----+----+----+---------+-----------+----------+
| 0|NULL|NULL|NULL|     NULL|       NULL|      NULL|
| 1|   x|   x|   x|     NULL|          x|         x|
| 2|NULL|NULL|NULL|     NULL|          x|         x|
| 3|NULL|NULL|NULL|     NULL|          x|         x|
| 4|   y|   y|   y|        y|          x|         y|
| 5|NULL|NULL|NULL|        y|          x|         y|
| 6|   z|   z|   z|        y|          x|         z|
| 7|   v|   v|   v|        y|          x|         v|
| 8|NULL|NULL|NULL|        y|          x|         v|
+--+----+----+----+---------+-----------+----------+
```

#### Fonctions de conversion
<a name="supported-sql-conversion"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).


****  

| Fonction | Description | 
| --- | --- | 
| bigint (expr) | Convertit la valeur « expr » en type de données cible « bigint ». | 
| binaire (expr) | Convertit la valeur « expr » en type de données cible « binaire ». | 
| booléen (expr) | Convertit la valeur « expr » en type de données cible « booléen ». | 
| fonte (type expr AS) | Convertit la valeur « expr » en type de données cible « type ». | 
| date d'expiration | Convertit la valeur « expr » en type de données cible « date ». | 
| décimal (expr) | Convertit la valeur « expr » en type de données cible « decimal ». | 
| double (expr) | Convertit la valeur « expr » en type de données cible « double ». | 
| flotteur (expr) | Convertit la valeur « expr` en type de données cible « float`. | 
| entier (expr) | Convertit la valeur « expr » en type de données cible « int ». | 
| smallint (expr) | Convertit la valeur « expr » en type de données cible « smallint ». | 
| chaîne (expr) | Convertit la valeur « expr » en type de données cible « string ». | 
| horodatage (expr) | Convertit la valeur « expr » vers le type de données cible « timestamp` ». | 
| tinyint (expr) | Convertit la valeur « expr » en type de données cible « tinyint ». | 

**Exemples**

```
-- cast
SELECT cast(field as int);
+---------------+
|CAST(field AS INT)|
+---------------+
|             10|
+---------------+
```

#### Fonctions de prédicat
<a name="supported-sql-predicate"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).


****  

| Fonction | Description | 
| --- | --- | 
| \$1 expr | Non logique | 
| expr 1 < expr 2 | Renvoie vrai si `expr1` est inférieur à `expr2`. | 
| expr 1 <= expr2 | Renvoie vrai si `expr1` est inférieur ou égal à `expr2`. | 
| expr 1 <=> expr2 | Renvoie le même résultat que l'opérateur EQUAL (=) pour les opérandes non nuls, mais renvoie true si les deux sont nuls, false si l'un des deux est nul. | 
| expr 1 = expr 2 | Renvoie vrai si « expr1 » est égal à « expr2 », ou faux dans le cas contraire. | 
| expr 1 = expr 2 | Renvoie vrai si « expr1 » est égal à « expr2 », ou faux dans le cas contraire. | 
| expr1 > expr2 | Renvoie vrai si `expr1` est supérieur à `expr2`. | 
| expr1 >= expr2 | Renvoie vrai si `expr1` est supérieur ou égal à `expr2`. | 
| expr1 et expr2 | Logique ET. | 
| motif semblable à une étoile [ESCAPE escape] | Renvoie true si str fait correspondre « pattern » à « escape » sans distinction majuscules et minuscules, null si l'un des arguments est nul, false dans le cas contraire. | 
| expr1 dans (expr2, expr3,...) | Renvoie vrai si `expr` est égal à un ValN quelconque. | 
| Nisnan (expr) | Renvoie vrai si « expr » est NaN, ou faux dans le cas contraire. | 
| n'est pas nul (expr) | Renvoie vrai si « expr » n'est pas nul, ou faux dans le cas contraire. | 
| est nul (expr) | Renvoie vrai si « expr » est nul, ou faux dans le cas contraire. | 
| motif semblable à une étoile [ESCAPE escape] | Renvoie true si str correspond à `pattern` avec `escape`, null si l'un des arguments est nul, false dans le cas contraire. | 
| pas expiré | Non logique | 
| expr1 ou expr2 | OU logique. | 
| regexp (str, regexp) | Renvoie vrai si `str` correspond à `regexp`, ou faux dans le cas contraire. | 
| regexp\$1like (str, regexp) | Renvoie vrai si `str` correspond à `regexp`, ou faux dans le cas contraire. | 
| rlike (str, regexp) | Renvoie vrai si `str` correspond à `regexp`, ou faux dans le cas contraire. | 

**Exemples**

```
-- !
SELECT ! true;
+----------+
|(NOT true)|
+----------+
|     false|
+----------+
SELECT ! false;
+-----------+
|(NOT false)|
+-----------+
|       true|
+-----------+
SELECT ! NULL;
+----------+
|(NOT NULL)|
+----------+
|      NULL|
+----------+
-- <
SELECT to_date('2009-07-30 04:17:52') < to_date('2009-07-30 04:17:52');
+-------------------------------------------------------------+
|(to_date(2009-07-30 04:17:52) < to_date(2009-07-30 04:17:52))|
+-------------------------------------------------------------+
|                                                        false|
+-------------------------------------------------------------+
SELECT to_date('2009-07-30 04:17:52') < to_date('2009-08-01 04:17:52');
+-------------------------------------------------------------+
|(to_date(2009-07-30 04:17:52) < to_date(2009-08-01 04:17:52))|
+-------------------------------------------------------------+
|                                                         true|
+-------------------------------------------------------------+
SELECT 1 < NULL;
+----------+
|(1 < NULL)|
+----------+
|      NULL|
+----------+
-- <=
SELECT 2 <= 2;
+--------+
|(2 <= 2)|
+--------+
|    true|
+--------+
SELECT 1.0 <= '1';
+----------+
|(1.0 <= 1)|
+----------+
|      true|
+----------+
SELECT to_date('2009-07-30 04:17:52') <= to_date('2009-07-30 04:17:52');
+--------------------------------------------------------------+
|(to_date(2009-07-30 04:17:52) <= to_date(2009-07-30 04:17:52))|
+--------------------------------------------------------------+
|                                                          true|
+--------------------------------------------------------------+
SELECT to_date('2009-07-30 04:17:52') <= to_date('2009-08-01 04:17:52');
+--------------------------------------------------------------+
|(to_date(2009-07-30 04:17:52) <= to_date(2009-08-01 04:17:52))|
+--------------------------------------------------------------+
|                                                          true|
+--------------------------------------------------------------+
SELECT 1 <= NULL;
+-----------+
|(1 <= NULL)|
+-----------+
|       NULL|
+-----------+
-- <=>
SELECT 2 <=> 2;
+---------+
|(2 <=> 2)|
+---------+
|     true|
+---------+
SELECT 1 <=> '1';
+---------+
|(1 <=> 1)|
+---------+
|     true|
+---------+
SELECT true <=> NULL;
+---------------+
|(true <=> NULL)|
+---------------+
|          false|
+---------------+
SELECT NULL <=> NULL;
+---------------+
|(NULL <=> NULL)|
+---------------+
|           true|
+---------------+
-- =
SELECT 2 = 2;
+-------+
|(2 = 2)|
+-------+
|   true|
+-------+
SELECT 1 = '1';
+-------+
|(1 = 1)|
+-------+
|   true|
+-------+
SELECT true = NULL;
+-------------+
|(true = NULL)|
+-------------+
|         NULL|
+-------------+
SELECT NULL = NULL;
+-------------+
|(NULL = NULL)|
+-------------+
|         NULL|
+-------------+
-- ==
SELECT 2 == 2;
+-------+
|(2 = 2)|
+-------+
|   true|
+-------+
SELECT 1 == '1';
+-------+
|(1 = 1)|
+-------+
|   true|
+-------+
SELECT true == NULL;
+-------------+
|(true = NULL)|
+-------------+
|         NULL|
+-------------+
SELECT NULL == NULL;
+-------------+
|(NULL = NULL)|
+-------------+
|         NULL|
+-------------+
-- >
SELECT 2 > 1;
+-------+
|(2 > 1)|
+-------+
|   true|
+-------+
SELECT 2 > 1.1;
+-------+
|(2 > 1)|
+-------+
|   true|
+-------+
SELECT to_date('2009-07-30 04:17:52') > to_date('2009-07-30 04:17:52');
+-------------------------------------------------------------+
|(to_date(2009-07-30 04:17:52) > to_date(2009-07-30 04:17:52))|
+-------------------------------------------------------------+
|                                                        false|
+-------------------------------------------------------------+
SELECT to_date('2009-07-30 04:17:52') > to_date('2009-08-01 04:17:52');
+-------------------------------------------------------------+
|(to_date(2009-07-30 04:17:52) > to_date(2009-08-01 04:17:52))|
+-------------------------------------------------------------+
|                                                        false|
+-------------------------------------------------------------+
SELECT 1 > NULL;
+----------+
|(1 > NULL)|
+----------+
|      NULL|
+----------+
-- >=
SELECT 2 >= 1;
+--------+
|(2 >= 1)|
+--------+
|    true|
+--------+
SELECT 2.0 >= '2.1';
+------------+
|(2.0 >= 2.1)|
+------------+
|       false|
+------------+
SELECT to_date('2009-07-30 04:17:52') >= to_date('2009-07-30 04:17:52');
+--------------------------------------------------------------+
|(to_date(2009-07-30 04:17:52) >= to_date(2009-07-30 04:17:52))|
+--------------------------------------------------------------+
|                                                          true|
+--------------------------------------------------------------+
SELECT to_date('2009-07-30 04:17:52') >= to_date('2009-08-01 04:17:52');
+--------------------------------------------------------------+
|(to_date(2009-07-30 04:17:52) >= to_date(2009-08-01 04:17:52))|
+--------------------------------------------------------------+
|                                                         false|
+--------------------------------------------------------------+
SELECT 1 >= NULL;
+-----------+
|(1 >= NULL)|
+-----------+
|       NULL|
+-----------+
-- and
SELECT true and true;
+---------------+
|(true AND true)|
+---------------+
|           true|
+---------------+
SELECT true and false;
+----------------+
|(true AND false)|
+----------------+
|           false|
+----------------+
SELECT true and NULL;
+---------------+
|(true AND NULL)|
+---------------+
|           NULL|
+---------------+
SELECT false and NULL;
+----------------+
|(false AND NULL)|
+----------------+
|           false|
+----------------+
-- ilike
SELECT ilike('Wagon', '_Agon');
+-------------------+
|ilike(Wagon, _Agon)|
+-------------------+
|               true|
+-------------------+
SELECT '%SystemDrive%\Users\John' ilike '\%SystemDrive\%\\users%';
+--------------------------------------------------------+
|ilike(%SystemDrive%\Users\John, \%SystemDrive\%\\users%)|
+--------------------------------------------------------+
|                                                    true|
+--------------------------------------------------------+
SELECT '%SystemDrive%\\USERS\\John' ilike '\%SystemDrive\%\\\\Users%';
+--------------------------------------------------------+
|ilike(%SystemDrive%\USERS\John, \%SystemDrive\%\\Users%)|
+--------------------------------------------------------+
|                                                    true|
+--------------------------------------------------------+
SELECT '%SystemDrive%/Users/John' ilike '/%SYSTEMDrive/%//Users%' ESCAPE '/';
+--------------------------------------------------------+
|ilike(%SystemDrive%/Users/John, /%SYSTEMDrive/%//Users%)|
+--------------------------------------------------------+
|                                                    true|
+--------------------------------------------------------+
-- in
SELECT 1 in(1, 2, 3);
+----------------+
|(1 IN (1, 2, 3))|
+----------------+
|            true|
+----------------+
SELECT 1 in(2, 3, 4);
+----------------+
|(1 IN (2, 3, 4))|
+----------------+
|           false|
+----------------+
SELECT named_struct('a', 1, 'b', 2) in(named_struct('a', 1, 'b', 1), named_struct('a', 1, 'b', 3));
+----------------------------------------------------------------------------------+
|(named_struct(a, 1, b, 2) IN (named_struct(a, 1, b, 1), named_struct(a, 1, b, 3)))|
+----------------------------------------------------------------------------------+
|                                                                             false|
+----------------------------------------------------------------------------------+
SELECT named_struct('a', 1, 'b', 2) in(named_struct('a', 1, 'b', 2), named_struct('a', 1, 'b', 3));
+----------------------------------------------------------------------------------+
|(named_struct(a, 1, b, 2) IN (named_struct(a, 1, b, 2), named_struct(a, 1, b, 3)))|
+----------------------------------------------------------------------------------+
|                                                                              true|
+----------------------------------------------------------------------------------+
-- isnan
SELECT isnan(cast('NaN' as double));
+--------------------------+
|isnan(CAST(NaN AS DOUBLE))|
+--------------------------+
|                      true|
+--------------------------+
-- isnotnull
SELECT isnotnull(1);
+---------------+
|(1 IS NOT NULL)|
+---------------+
|           true|
+---------------+
-- isnull
SELECT isnull(1);
+-----------+
|(1 IS NULL)|
+-----------+
|      false|
+-----------+
-- like
SELECT like('Wagon', '_Agon');
+----------------+
|Wagon LIKE _Agon|
+----------------+
|            true|
+----------------+
-- not
SELECT not true;
+----------+
|(NOT true)|
+----------+
|     false|
+----------+
SELECT not false;
+-----------+
|(NOT false)|
+-----------+
|       true|
+-----------+
SELECT not NULL;
+----------+
|(NOT NULL)|
+----------+
|      NULL|
+----------+
-- or
SELECT true or false;
+---------------+
|(true OR false)|
+---------------+
|           true|
+---------------+
SELECT false or false;
+----------------+
|(false OR false)|
+----------------+
|           false|
+----------------+
SELECT true or NULL;
+--------------+
|(true OR NULL)|
+--------------+
|          true|
+--------------+
SELECT false or NULL;
+---------------+
|(false OR NULL)|
+---------------+
|           NULL|
+---------------+
```

#### Fonctions cartographiques
<a name="supported-sql-map"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).


****  

| Fonction | Description | 
| --- | --- | 
| element\$1at (tableau, index) | Renvoie l'élément du tableau à un index donné (basé sur 1). | 
| element\$1at (carte, clé) | Renvoie la valeur d'une clé donnée. La fonction renvoie NULL si la clé n'est pas contenue dans la carte. | 
| carte (clé0, valeur0, clé1, valeur1,...) | Crée une carte avec les key/value paires indiquées. | 
| map\$1concat (carte,...) | Renvoie l'union de toutes les cartes données | 
| map\$1contains\$1key (carte, clé) | Renvoie vrai si la carte contient la clé. | 
| map\$1entries (carte) | Renvoie un tableau non ordonné de toutes les entrées de la carte donnée. | 
| map\$1from\$1arrays (clés, valeurs) | Crée une carte avec une paire des key/value tableaux donnés. Tous les éléments des clés ne doivent pas être nuls | 
| map\$1from\$1entries () arrayOfEntries | Renvoie une carte créée à partir du tableau d'entrées donné. | 
| map\$1keys (carte) | Renvoie un tableau non ordonné contenant les clés de la carte. | 
| map\$1values (carte) | Renvoie un tableau non ordonné contenant les valeurs de la carte. | 
| str\$1to\$1map (texte [, PairDelim [,]]) keyValueDelim | Crée une carte après avoir divisé le texte en paires clé/valeur à l'aide de délimiteurs. Les délimiteurs par défaut sont ',' pour `PairDelim` et ':' pour ``. keyValueDelim `PairDelim` et `keyValueDelim` sont tous deux traités comme des expressions régulières. | 
| try\$1element\$1at (tableau, index) | Renvoie l'élément du tableau à un index donné (basé sur 1). Si l'index est égal à 0, le système génère une erreur. Si l'indice est inférieur à 0, accède aux éléments du dernier au premier. La fonction renvoie toujours la valeur NULL si l'index dépasse la longueur du tableau. | 
| try\$1element\$1at (carte, clé) | Renvoie la valeur d'une clé donnée. La fonction renvoie toujours NULL si la clé n'est pas contenue dans la carte. | 

**Exemples**

```
-- element_at
SELECT element_at(array(1, 2, 3), 2);
+-----------------------------+
|element_at(array(1, 2, 3), 2)|
+-----------------------------+
|                            2|
+-----------------------------+
SELECT element_at(map(1, 'a', 2, 'b'), 2);
+------------------------------+
|element_at(map(1, a, 2, b), 2)|
+------------------------------+
|                             b|
+------------------------------+
-- map
SELECT map(1.0, '2', 3.0, '4');
+--------------------+
| map(1.0, 2, 3.0, 4)|
+--------------------+
|{1.0 -> 2, 3.0 -> 4}|
+--------------------+
-- map_concat
SELECT map_concat(map(1, 'a', 2, 'b'), map(3, 'c'));
+--------------------------------------+
|map_concat(map(1, a, 2, b), map(3, c))|
+--------------------------------------+
|                  {1 -> a, 2 -> b, ...|
+--------------------------------------+
-- map_contains_key
SELECT map_contains_key(map(1, 'a', 2, 'b'), 1);
+------------------------------------+
|map_contains_key(map(1, a, 2, b), 1)|
+------------------------------------+
|                                true|
+------------------------------------+
SELECT map_contains_key(map(1, 'a', 2, 'b'), 3);
+------------------------------------+
|map_contains_key(map(1, a, 2, b), 3)|
+------------------------------------+
|                               false|
+------------------------------------+
-- map_entries
SELECT map_entries(map(1, 'a', 2, 'b'));
+----------------------------+
|map_entries(map(1, a, 2, b))|
+----------------------------+
|            [{1, a}, {2, b}]|
+----------------------------+
-- map_from_arrays
SELECT map_from_arrays(array(1.0, 3.0), array('2', '4'));
+---------------------------------------------+
|map_from_arrays(array(1.0, 3.0), array(2, 4))|
+---------------------------------------------+
|                         {1.0 -> 2, 3.0 -> 4}|
+---------------------------------------------+
-- map_from_entries
SELECT map_from_entries(array(struct(1, 'a'), struct(2, 'b')));
+---------------------------------------------------+
|map_from_entries(array(struct(1, a), struct(2, b)))|
+---------------------------------------------------+
|                                   {1 -> a, 2 -> b}|
+---------------------------------------------------+
-- map_keys
SELECT map_keys(map(1, 'a', 2, 'b'));
+-------------------------+
|map_keys(map(1, a, 2, b))|
+-------------------------+
|                   [1, 2]|
+-------------------------+
-- map_values
SELECT map_values(map(1, 'a', 2, 'b'));
+---------------------------+
|map_values(map(1, a, 2, b))|
+---------------------------+
|                     [a, b]|
+---------------------------+
-- str_to_map
SELECT str_to_map('a:1,b:2,c:3', ',', ':');
+-----------------------------+
|str_to_map(a:1,b:2,c:3, ,, :)|
+-----------------------------+
|         {a -> 1, b -> 2, ...|
+-----------------------------+
SELECT str_to_map('a');
+-------------------+
|str_to_map(a, ,, :)|
+-------------------+
|        {a -> NULL}|
+-------------------+
-- try_element_at
SELECT try_element_at(array(1, 2, 3), 2);
+---------------------------------+
|try_element_at(array(1, 2, 3), 2)|
+---------------------------------+
|                                2|
+---------------------------------+
SELECT try_element_at(map(1, 'a', 2, 'b'), 2);
+----------------------------------+
|try_element_at(map(1, a, 2, b), 2)|
+----------------------------------+
|                                 b|
+----------------------------------+
```

#### Fonctions mathématiques
<a name="supported-sql-math"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).


****  

| Fonction | Description | 
| --- | --- | 
| expr 1 % expr2 | Renvoie le reste après `expr1`/`expr2`. | 
| expr 1 \$1 expr2 | Renvoie `expr1`\$1`expr2`. | 
| expr 1 \$1 expr2 | Renvoie `expr1`\$1`expr2`. | 
| expr1 - expr2 | Renvoie `expr1`-`expr2`. | 
| expr1/expr2 | Renvoie `expr1`/`expr2`. Il effectue toujours une division en virgule flottante. | 
| Tabs (expr) | Renvoie la valeur absolue de la valeur numérique ou de la valeur d'intervalle. | 
| Macos (expert) | Renvoie le cosinus inverse (alias arc cosinus) de `expr`, comme s'il était calculé par `java.lang.Math.acos`. | 
| Lacosh (expr) | Renvoie le cosinus hyperbolique inverse de « expr ». | 
| ASIN (expr) | Renvoie le sinus inverse (alias arc sinus), l'arc sin de `expr`, comme s'il était calculé par `java.lang.Math.asin`. | 
| asinh (expr) | Renvoie le sinus hyperbolique inverse de « expr ». | 
| Satan (expert) | Renvoie la tangente inverse (alias arc tangente) de `expr`, comme si elle était calculée par `java.lang.Math.Atan` | 
| atan2 (ExPry, ExPrx) | Renvoie l'angle en radians entre l'axe X positif d'un plan et le point donné par les coordonnées (`ExprX`, `ExprY`), comme s'il était calculé par `java.lang.Math.atan2`. | 
| Katanh (expert) | Renvoie la tangente hyperbolique inverse de « expr ». | 
| poubelle (expr) | Renvoie la représentation sous forme de chaîne de la valeur longue « expr » représentée en binaire. | 
| sol (expr, d) | Renvoie `expr` arrondi à `d` décimales en utilisant le mode d'arrondissement HALF\$1EVEN. | 
| cbrt (expr) | Renvoie la racine cubique de `expr`. | 
| plafond (expr [, échelle]) | Renvoie le plus petit nombre après arrondissement qui n'est pas inférieur à « expr ». Un paramètre optionnel « scale » peut être spécifié pour contrôler le comportement d'arrondissement. | 
| plafond (expr [, échelle]) | Renvoie le plus petit nombre après arrondissement qui n'est pas inférieur à « expr ». Un paramètre optionnel « scale » peut être spécifié pour contrôler le comportement d'arrondissement. | 
| conv (num, from\$1base, to\$1base) | Convertissez `num` de `from\$1base` en `to\$1base`. | 
| coût (expr) | Renvoie le cosinus de `expr`, comme s'il était calculé par `java.lang.Math.cos`. | 
| cosy (expr) | Renvoie le cosinus hyperbolique de `expr`, comme s'il était calculé par `java.lang.Math.Cosh`. | 
| lit (expr) | Renvoie la cotangente de `expr`, comme si elle était calculée par `1/java.lang.Math.tan`. | 
| csc (expr) | Renvoie la cosécante de `expr`, comme si elle était calculée par `1/java.lang.Math.sin`. | 
| diplômes (expr) | Convertit les radians en degrés. | 
| expr1 div expr2 | Divisez « expr1 » par « expr2 ». Elle renvoie NULL si un opérande est NULL ou si « expr2 » vaut 0. Le résultat est trop long. | 
| e () | Renvoie le numéro d'Euler, e. | 
| exp (expr) | Rétablit e à la puissance de « expr ». | 
| expm1 (expr) - Renvoie exp (`expr`) | 1 | 
| factoriel (expr) | Renvoie la factorielle de « expr ». `expr` est [0.. 20]. Null dans le cas contraire. | 
| étage (expr [, échelle]) | Renvoie le plus grand nombre après arrondissement inférieur qui n'est pas supérieur à « expr ». Un paramètre optionnel « scale » peut être spécifié pour contrôler le comportement d'arrondissement. | 
| le meilleur (expr,...) | Renvoie la plus grande valeur de tous les paramètres, en omettant les valeurs nulles. | 
| hexadécimal (expr) | Convertit `expr` en hexadécimal. | 
| hypot (expr 1, expr 2) | Renvoie sqrt (`expr1`\$1\$12 \$1 `expr2`\$1\$12). | 
| moins (expr,...) | Renvoie la plus petite valeur de tous les paramètres, en omettant les valeurs nulles. | 
| ln (expr) | Renvoie le logarithme naturel (base e) de « expr ». | 
| journal (base, expr) | Renvoie le logarithme de `expr` avec `base`. | 
| log10 (expr) | Renvoie le logarithme de « expr » en base 10. | 
| log1p (expr) | Renvoie log (1 \$1 `expr`). | 
| log2 (expr) | Renvoie le logarithme de « expr » en base 2. | 
| expr1 mod expr2 | Renvoie le reste après `expr1`/`expr2`. | 
| négatif (expr) | Renvoie la valeur négative de « expr ». | 
| épi () | Renvoie pi. | 
| pmod (expr1, expr 2) | Renvoie la valeur positive de `expr1` mod `expr2`. | 
| positif (expr) | Renvoie la valeur de « expr ». | 
| pow (expr1, expr 2) | Augmente `expr1` à la puissance de `expr2`. | 
| puissance (expr1, expr2) | Augmente `expr1` à la puissance de `expr2`. | 
| radians (expr) | Convertit les degrés en radians. | 
| rand ([graine]) | Renvoie une valeur aléatoire avec des valeurs indépendantes et distribuées de manière identique (i.i.d.) uniformément dans [0, 1). | 
| randn ([graine]) | Renvoie une valeur aléatoire avec des valeurs indépendantes et distribuées de manière identique (i.i.d.) tirées de la distribution normale standard. | 
| aléatoire ([graine]) | Renvoie une valeur aléatoire avec des valeurs indépendantes et distribuées de manière identique (i.i.d.) uniformément dans [0, 1). | 
| Imprimer (expr) | Renvoie la valeur double dont la valeur est la plus proche de l'argument et qui est égale à un entier mathématique. | 
| rond (expr, d) | Renvoie `expr` arrondi à `d` décimales en utilisant le mode d'arrondissement HALF\$1UP. | 
| seconde (expr) | Renvoie le sécant de `expr`, comme s'il était calculé par `1/java.lang.Math.cos`. | 
| shiftleft (base, expr) | Décalage bit par bit vers la gauche. | 
| signe (expr) | Renvoie -1.0, 0.0 ou 1.0 car « expr » est négatif, 0 ou positif. | 
| signature (expr) | Renvoie -1.0, 0.0 ou 1.0 car « expr » est négatif, 0 ou positif. | 
| péché (expr) | Renvoie le sinus de `expr`, comme s'il était calculé par `java.lang.Math.sin`. | 
| sinh (expr) | Renvoie le sinus hyperbolique de `expr`, comme s'il était calculé par `java.lang.Math.SinH`. | 
| carré (expr) | Renvoie la racine carrée de « expr ». | 
| bronzage (expr) | Renvoie la tangente de `expr`, comme si elle était calculée par `java.lang.Math.tan`. | 
| tanh (expr) | Renvoie la tangente hyperbolique de `expr`, comme si elle était calculée par `java.lang.Math.TANH`. | 
| try\$1add (expr 1, expr 2) | Renvoie la somme de « expr 1 » et « expr2 » et le résultat est nul en cas de débordement. Les types d'entrée acceptables sont les mêmes avec l'opérateur « \$1 ». | 
| try\$1divide (dividende, diviseur) | Renvoie « dividende » ou « diviseur ». Il effectue toujours une division en virgule flottante. Son résultat est toujours nul si « expr2 » vaut 0. le « dividende » doit être un chiffre ou un intervalle. le « diviseur » doit être un chiffre. | 
| try\$1multiply (expr 1, expr 2) | Renvoie `expr1`\$1`expr2` et le résultat est nul en cas de débordement. Les types d'entrée acceptables sont les mêmes avec l'opérateur `\$1`. | 
| try\$1subtract (expr1, expr 2) | Renvoie `expr1`-`expr2` et le résultat est nul en cas de débordement. Les types d'entrée acceptables sont les mêmes avec l'opérateur « - ». | 
| unhex (expr) | Convertit l'hexadécimal `expr` en binaire. | 
| width\$1bucket (valeur, valeur minimale, valeur maximale, num\$1bucket) | Renvoie le numéro de compartiment auquel « value » serait attribuée dans un histogramme d'équilargeur avec des compartiments « num\$1bucket », compris entre « min\$1value » et « max\$1value ». » | 

**Exemples**

```
-- %
SELECT 2 % 1.8;
+---------+
|(2 % 1.8)|
+---------+
|      0.2|
+---------+
SELECT MOD(2, 1.8);
+-----------+
|mod(2, 1.8)|
+-----------+
|        0.2|
+-----------+
-- *
SELECT 2 * 3;
+-------+
|(2 * 3)|
+-------+
|      6|
+-------+
-- +
SELECT 1 + 2;
+-------+
|(1 + 2)|
+-------+
|      3|
+-------+
-- -
SELECT 2 - 1;
+-------+
|(2 - 1)|
+-------+
|      1|
+-------+
-- /
SELECT 3 / 2;
+-------+
|(3 / 2)|
+-------+
|    1.5|
+-------+
SELECT 2L / 2L;
+-------+
|(2 / 2)|
+-------+
|    1.0|
+-------+
-- abs
SELECT abs(-1);
+-------+
|abs(-1)|
+-------+
|      1|
+-------+
SELECT abs(INTERVAL -'1-1' YEAR TO MONTH);
+----------------------------------+
|abs(INTERVAL '-1-1' YEAR TO MONTH)|
+----------------------------------+
|              INTERVAL '1-1' YE...|
+----------------------------------+
-- acos
SELECT acos(1);
+-------+
|ACOS(1)|
+-------+
|    0.0|
+-------+
SELECT acos(2);
+-------+
|ACOS(2)|
+-------+
|    NaN|
+-------+
-- acosh
SELECT acosh(1);
+--------+
|ACOSH(1)|
+--------+
|     0.0|
+--------+
SELECT acosh(0);
+--------+
|ACOSH(0)|
+--------+
|     NaN|
+--------+
-- asin
SELECT asin(0);
+-------+
|ASIN(0)|
+-------+
|    0.0|
+-------+
SELECT asin(2);
+-------+
|ASIN(2)|
+-------+
|    NaN|
+-------+
-- asinh
SELECT asinh(0);
+--------+
|ASINH(0)|
+--------+
|     0.0|
+--------+
-- atan
SELECT atan(0);
+-------+
|ATAN(0)|
+-------+
|    0.0|
+-------+
-- atan2
SELECT atan2(0, 0);
+-----------+
|ATAN2(0, 0)|
+-----------+
|        0.0|
+-----------+
-- atanh
SELECT atanh(0);
+--------+
|ATANH(0)|
+--------+
|     0.0|
+--------+
SELECT atanh(2);
+--------+
|ATANH(2)|
+--------+
|     NaN|
+--------+
-- bin
SELECT bin(13);
+-------+
|bin(13)|
+-------+
|   1101|
+-------+
SELECT bin(-13);
+--------------------+
|            bin(-13)|
+--------------------+
|11111111111111111...|
+--------------------+
SELECT bin(13.3);
+---------+
|bin(13.3)|
+---------+
|     1101|
+---------+
-- bround
SELECT bround(2.5, 0);
+--------------+
|bround(2.5, 0)|
+--------------+
|             2|
+--------------+
SELECT bround(25, -1);
+--------------+
|bround(25, -1)|
+--------------+
|            20|
+--------------+
-- cbrt
SELECT cbrt(27.0);
+----------+
|CBRT(27.0)|
+----------+
|       3.0|
+----------+
-- ceil
SELECT ceil(-0.1);
+----------+
|CEIL(-0.1)|
+----------+
|         0|
+----------+
SELECT ceil(5);
+-------+
|CEIL(5)|
+-------+
|      5|
+-------+
SELECT ceil(3.1411, 3);
+---------------+
|ceil(3.1411, 3)|
+---------------+
|          3.142|
+---------------+
SELECT ceil(3.1411, -3);
+----------------+
|ceil(3.1411, -3)|
+----------------+
|            1000|
+----------------+
-- ceiling
SELECT ceiling(-0.1);
+-------------+
|ceiling(-0.1)|
+-------------+
|            0|
+-------------+
SELECT ceiling(5);
+----------+
|ceiling(5)|
+----------+
|         5|
+----------+
SELECT ceiling(3.1411, 3);
+------------------+
|ceiling(3.1411, 3)|
+------------------+
|             3.142|
+------------------+
SELECT ceiling(3.1411, -3);
+-------------------+
|ceiling(3.1411, -3)|
+-------------------+
|               1000|
+-------------------+
-- conv
SELECT conv('100', 2, 10);
+----------------+
|conv(100, 2, 10)|
+----------------+
|               4|
+----------------+
SELECT conv(-10, 16, -10);
+------------------+
|conv(-10, 16, -10)|
+------------------+
|               -16|
+------------------+
-- cos
SELECT cos(0);
+------+
|COS(0)|
+------+
|   1.0|
+------+
-- cosh
SELECT cosh(0);
+-------+
|COSH(0)|
+-------+
|    1.0|
+-------+
-- cot
SELECT cot(1);
+------------------+
|            COT(1)|
+------------------+
|0.6420926159343306|
+------------------+
-- csc
SELECT csc(1);
+------------------+
|            CSC(1)|
+------------------+
|1.1883951057781212|
+------------------+
-- degrees
SELECT degrees(3.141592653589793);
+--------------------------+
|DEGREES(3.141592653589793)|
+--------------------------+
|                     180.0|
+--------------------------+
-- div
SELECT 3 div 2;
+---------+
|(3 div 2)|
+---------+
|        1|
+---------+
SELECT INTERVAL '1-1' YEAR TO MONTH div INTERVAL '-1' MONTH;
+------------------------------------------------------+
|(INTERVAL '1-1' YEAR TO MONTH div INTERVAL '-1' MONTH)|
+------------------------------------------------------+
|                                                   -13|
+------------------------------------------------------+
-- e
SELECT e();
+-----------------+
|              E()|
+-----------------+
|2.718281828459045|
+-----------------+
-- exp
SELECT exp(0);
+------+
|EXP(0)|
+------+
|   1.0|
+------+
-- expm1
SELECT expm1(0);
+--------+
|EXPM1(0)|
+--------+
|     0.0|
+--------+
-- factorial
SELECT factorial(5);
+------------+
|factorial(5)|
+------------+
|         120|
+------------+
-- floor
SELECT floor(-0.1);
+-----------+
|FLOOR(-0.1)|
+-----------+
|         -1|
+-----------+
SELECT floor(5);
+--------+
|FLOOR(5)|
+--------+
|       5|
+--------+
SELECT floor(3.1411, 3);
+----------------+
|floor(3.1411, 3)|
+----------------+
|           3.141|
+----------------+
SELECT floor(3.1411, -3);
+-----------------+
|floor(3.1411, -3)|
+-----------------+
|                0|
+-----------------+
-- greatest
SELECT greatest(10, 9, 2, 4, 3);
+------------------------+
|greatest(10, 9, 2, 4, 3)|
+------------------------+
|                      10|
+------------------------+
-- hex
SELECT hex(17);
+-------+
|hex(17)|
+-------+
|     11|
+-------+
SELECT hex('SQL');
+------------------+
|    hex(SQL)|
+------------------+
|53514C|
+------------------+
-- hypot
SELECT hypot(3, 4);
+-----------+
|HYPOT(3, 4)|
+-----------+
|        5.0|
+-----------+
-- least
SELECT least(10, 9, 2, 4, 3);
+---------------------+
|least(10, 9, 2, 4, 3)|
+---------------------+
|                    2|
+---------------------+
-- ln
SELECT ln(1);
+-----+
|ln(1)|
+-----+
|  0.0|
+-----+
-- log
SELECT log(10, 100);
+------------+
|LOG(10, 100)|
+------------+
|         2.0|
+------------+
-- log10
SELECT log10(10);
+---------+
|LOG10(10)|
+---------+
|      1.0|
+---------+
-- log1p
SELECT log1p(0);
+--------+
|LOG1P(0)|
+--------+
|     0.0|
+--------+
-- log2
SELECT log2(2);
+-------+
|LOG2(2)|
+-------+
|    1.0|
+-------+
-- mod
SELECT 2 % 1.8;
+---------+
|(2 % 1.8)|
+---------+
|      0.2|
+---------+
SELECT MOD(2, 1.8);
+-----------+
|mod(2, 1.8)|
+-----------+
|        0.2|
+-----------+
-- negative
SELECT negative(1);
+-----------+
|negative(1)|
+-----------+
|         -1|
+-----------+
-- pi
SELECT pi();
+-----------------+
|             PI()|
+-----------------+
|3.141592653589793|
+-----------------+
-- pmod
SELECT pmod(10, 3);
+-----------+
|pmod(10, 3)|
+-----------+
|          1|
+-----------+
SELECT pmod(-10, 3);
+------------+
|pmod(-10, 3)|
+------------+
|           2|
+------------+
-- positive
SELECT positive(1);
+-----+
|(+ 1)|
+-----+
|    1|
+-----+
-- pow
SELECT pow(2, 3);
+---------+
|pow(2, 3)|
+---------+
|      8.0|
+---------+
-- power
SELECT power(2, 3);
+-----------+
|POWER(2, 3)|
+-----------+
|        8.0|
+-----------+
-- radians
SELECT radians(180);
+-----------------+
|     RADIANS(180)|
+-----------------+
|3.141592653589793|
+-----------------+
-- rand
SELECT rand();
+------------------+
|            rand()|
+------------------+
|0.7211420708112387|
+------------------+
SELECT rand(0);
+------------------+
|           rand(0)|
+------------------+
|0.7604953758285915|
+------------------+
SELECT rand(null);
+------------------+
|        rand(NULL)|
+------------------+
|0.7604953758285915|
+------------------+
-- randn
SELECT randn();
+-------------------+
|            randn()|
+-------------------+
|-0.8175603217732732|
+-------------------+
SELECT randn(0);
+------------------+
|          randn(0)|
+------------------+
|1.6034991609278433|
+------------------+
SELECT randn(null);
+------------------+
|       randn(NULL)|
+------------------+
|1.6034991609278433|
+------------------+
-- random
SELECT random();
+-----------------+
|           rand()|
+-----------------+
|0.394205008255365|
+-----------------+
SELECT random(0);
+------------------+
|           rand(0)|
+------------------+
|0.7604953758285915|
+------------------+
SELECT random(null);
+------------------+
|        rand(NULL)|
+------------------+
|0.7604953758285915|
+------------------+
-- rint
SELECT rint(12.3456);
+-------------+
|rint(12.3456)|
+-------------+
|         12.0|
+-------------+
-- round
SELECT round(2.5, 0);
+-------------+
|round(2.5, 0)|
+-------------+
|            3|
+-------------+
-- sec
SELECT sec(0);
+------+
|SEC(0)|
+------+
|   1.0|
+------+
-- shiftleft
SELECT shiftleft(2, 1);
+---------------+
|shiftleft(2, 1)|
+---------------+
|              4|
+---------------+
-- sign
SELECT sign(40);
+--------+
|sign(40)|
+--------+
|     1.0|
+--------+
SELECT sign(INTERVAL -'100' YEAR);
+--------------------------+
|sign(INTERVAL '-100' YEAR)|
+--------------------------+
|                      -1.0|
+--------------------------+
-- signum
SELECT signum(40);
+----------+
|SIGNUM(40)|
+----------+
|       1.0|
+----------+
SELECT signum(INTERVAL -'100' YEAR);
+----------------------------+
|SIGNUM(INTERVAL '-100' YEAR)|
+----------------------------+
|                        -1.0|
+----------------------------+
-- sin
SELECT sin(0);
+------+
|SIN(0)|
+------+
|   0.0|
+------+
-- sinh
SELECT sinh(0);
+-------+
|SINH(0)|
+-------+
|    0.0|
+-------+
-- sqrt
SELECT sqrt(4);
+-------+
|SQRT(4)|
+-------+
|    2.0|
+-------+
-- tan
SELECT tan(0);
+------+
|TAN(0)|
+------+
|   0.0|
+------+
-- tanh
SELECT tanh(0);
+-------+
|TANH(0)|
+-------+
|    0.0|
+-------+
-- try_add
SELECT try_add(1, 2);
+-------------+
|try_add(1, 2)|
+-------------+
|            3|
+-------------+
SELECT try_add(2147483647, 1);
+----------------------+
|try_add(2147483647, 1)|
+----------------------+
|                  NULL|
+----------------------+
SELECT try_add(date'2021-01-01', 1);
+-----------------------------+
|try_add(DATE '2021-01-01', 1)|
+-----------------------------+
|                   2021-01-02|
+-----------------------------+
SELECT try_add(date'2021-01-01', interval 1 year);
+---------------------------------------------+
|try_add(DATE '2021-01-01', INTERVAL '1' YEAR)|
+---------------------------------------------+
|                                   2022-01-01|
+---------------------------------------------+
SELECT try_add(timestamp'2021-01-01 00:00:00', interval 1 day);
+----------------------------------------------------------+
|try_add(TIMESTAMP '2021-01-01 00:00:00', INTERVAL '1' DAY)|
+----------------------------------------------------------+
|                                       2021-01-02 00:00:00|
+----------------------------------------------------------+
SELECT try_add(interval 1 year, interval 2 year);
+---------------------------------------------+
|try_add(INTERVAL '1' YEAR, INTERVAL '2' YEAR)|
+---------------------------------------------+
|                            INTERVAL '3' YEAR|
+---------------------------------------------+
-- try_divide
SELECT try_divide(3, 2);
+----------------+
|try_divide(3, 2)|
+----------------+
|             1.5|
+----------------+
SELECT try_divide(2L, 2L);
+----------------+
|try_divide(2, 2)|
+----------------+
|             1.0|
+----------------+
SELECT try_divide(1, 0);
+----------------+
|try_divide(1, 0)|
+----------------+
|            NULL|
+----------------+
SELECT try_divide(interval 2 month, 2);
+---------------------------------+
|try_divide(INTERVAL '2' MONTH, 2)|
+---------------------------------+
|             INTERVAL '0-1' YE...|
+---------------------------------+
SELECT try_divide(interval 2 month, 0);
+---------------------------------+
|try_divide(INTERVAL '2' MONTH, 0)|
+---------------------------------+
|                             NULL|
+---------------------------------+
-- try_multiply
SELECT try_multiply(2, 3);
+------------------+
|try_multiply(2, 3)|
+------------------+
|                 6|
+------------------+
SELECT try_multiply(-2147483648, 10);
+-----------------------------+
|try_multiply(-2147483648, 10)|
+-----------------------------+
|                         NULL|
+-----------------------------+
SELECT try_multiply(interval 2 year, 3);
+----------------------------------+
|try_multiply(INTERVAL '2' YEAR, 3)|
+----------------------------------+
|              INTERVAL '6-0' YE...|
+----------------------------------+
-- try_subtract
SELECT try_subtract(2, 1);
+------------------+
|try_subtract(2, 1)|
+------------------+
|                 1|
+------------------+
SELECT try_subtract(-2147483648, 1);
+----------------------------+
|try_subtract(-2147483648, 1)|
+----------------------------+
|                        NULL|
+----------------------------+
SELECT try_subtract(date'2021-01-02', 1);
+----------------------------------+
|try_subtract(DATE '2021-01-02', 1)|
+----------------------------------+
|                        2021-01-01|
+----------------------------------+
SELECT try_subtract(date'2021-01-01', interval 1 year);
+--------------------------------------------------+
|try_subtract(DATE '2021-01-01', INTERVAL '1' YEAR)|
+--------------------------------------------------+
|                                        2020-01-01|
+--------------------------------------------------+
SELECT try_subtract(timestamp'2021-01-02 00:00:00', interval 1 day);
+---------------------------------------------------------------+
|try_subtract(TIMESTAMP '2021-01-02 00:00:00', INTERVAL '1' DAY)|
+---------------------------------------------------------------+
|                                            2021-01-01 00:00:00|
+---------------------------------------------------------------+
SELECT try_subtract(interval 2 year, interval 1 year);
+--------------------------------------------------+
|try_subtract(INTERVAL '2' YEAR, INTERVAL '1' YEAR)|
+--------------------------------------------------+
|                                 INTERVAL '1' YEAR|
+--------------------------------------------------+
-- unhex
SELECT decode(unhex('53514C'), 'UTF-8');
+----------------------------------------+
|decode(unhex(53514C), UTF-8)|
+----------------------------------------+
|                               SQL|
+----------------------------------------+
-- width_bucket
SELECT width_bucket(5.3, 0.2, 10.6, 5);
+-------------------------------+
|width_bucket(5.3, 0.2, 10.6, 5)|
+-------------------------------+
|                              3|
+-------------------------------+
SELECT width_bucket(-2.1, 1.3, 3.4, 3);
+-------------------------------+
|width_bucket(-2.1, 1.3, 3.4, 3)|
+-------------------------------+
|                              0|
+-------------------------------+
SELECT width_bucket(8.1, 0.0, 5.7, 4);
+------------------------------+
|width_bucket(8.1, 0.0, 5.7, 4)|
+------------------------------+
|                             5|
+------------------------------+
SELECT width_bucket(-0.9, 5.2, 0.5, 2);
+-------------------------------+
|width_bucket(-0.9, 5.2, 0.5, 2)|
+-------------------------------+
|                              3|
+-------------------------------+
SELECT width_bucket(INTERVAL '0' YEAR, INTERVAL '0' YEAR, INTERVAL '10' YEAR, 10);
+--------------------------------------------------------------------------+
|width_bucket(INTERVAL '0' YEAR, INTERVAL '0' YEAR, INTERVAL '10' YEAR, 10)|
+--------------------------------------------------------------------------+
|                                                                         1|
+--------------------------------------------------------------------------+
SELECT width_bucket(INTERVAL '1' YEAR, INTERVAL '0' YEAR, INTERVAL '10' YEAR, 10);
+--------------------------------------------------------------------------+
|width_bucket(INTERVAL '1' YEAR, INTERVAL '0' YEAR, INTERVAL '10' YEAR, 10)|
+--------------------------------------------------------------------------+
|                                                                         2|
+--------------------------------------------------------------------------+
SELECT width_bucket(INTERVAL '0' DAY, INTERVAL '0' DAY, INTERVAL '10' DAY, 10);
+-----------------------------------------------------------------------+
|width_bucket(INTERVAL '0' DAY, INTERVAL '0' DAY, INTERVAL '10' DAY, 10)|
+-----------------------------------------------------------------------+
|                                                                      1|
+-----------------------------------------------------------------------+
SELECT width_bucket(INTERVAL '1' DAY, INTERVAL '0' DAY, INTERVAL '10' DAY, 10);
+-----------------------------------------------------------------------+
|width_bucket(INTERVAL '1' DAY, INTERVAL '0' DAY, INTERVAL '10' DAY, 10)|
+-----------------------------------------------------------------------+
|                                                                      2|
+-----------------------------------------------------------------------+
```

#### Fonctions du générateur
<a name="supported-sql-generator"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge ces fonctions SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).


****  

| Fonction | Description | 
| --- | --- | 
| exploser (expr) | Sépare les éléments du tableau « expr » en plusieurs lignes, ou les éléments de la carte « expr » en plusieurs lignes et colonnes. Sauf indication contraire, utilise le nom de colonne par défaut « col » pour les éléments du tableau ou « key » et « value » pour les éléments de la carte. | 
| explode\$1outer (expr) | Sépare les éléments du tableau « expr » en plusieurs lignes, ou les éléments de la carte « expr » en plusieurs lignes et colonnes. Sauf indication contraire, utilise le nom de colonne par défaut « col » pour les éléments du tableau ou « key » et « value » pour les éléments de la carte. | 
| en ligne (expr) | Fait exploser un tableau de structures. Utilise les noms de colonne col1, col2, etc. par défaut, sauf indication contraire. | 
| inline\$1router (expr) | Fait exploser un tableau de structures. Utilise les noms de colonne col1, col2, etc. par défaut, sauf indication contraire. | 
| posexplode (expr) | Sépare les éléments du tableau « expr » en plusieurs lignes avec des positions, ou les éléments de la carte « expr » en plusieurs lignes et colonnes avec des positions. Sauf indication contraire, utilise le nom de colonne `pos` pour la position, `col` pour les éléments du tableau ou `key` et `value` pour les éléments de la carte. | 
| posexplode\$1outer (expr) | Sépare les éléments du tableau « expr » en plusieurs lignes avec des positions, ou les éléments de la carte « expr » en plusieurs lignes et colonnes avec des positions. Sauf indication contraire, utilise le nom de colonne `pos` pour la position, `col` pour les éléments du tableau ou `key` et `value` pour les éléments de la carte. | 
| pile (n, expr1,..., exprk) | Sépare `expr1`,..., `exprok` en `n` lignes. Utilise les noms de colonne col0, col1, etc. par défaut, sauf indication contraire. | 

**Exemples**

```
-- explode
SELECT explode(array(10, 20));
+---+
|col|
+---+
| 10|
| 20|
+---+

SELECT explode(collection => array(10, 20));
+---+
|col|
+---+
| 10|
| 20|
+---+

SELECT * FROM explode(collection => array(10, 20));
+---+
|col|
+---+
| 10|
| 20|
+---+

-- explode_outer
SELECT explode_outer(array(10, 20));
+---+
|col|
+---+
| 10|
| 20|
+---+

SELECT explode_outer(collection => array(10, 20));
+---+
|col|
+---+
| 10|
| 20|
+---+

SELECT * FROM explode_outer(collection => array(10, 20));
+---+
|col|
+---+
| 10|
| 20|
+---+

-- inline
SELECT inline(array(struct(1, 'a'), struct(2, 'b')));
+----+----+
|col1|col2|
+----+----+
|   1|   a|
|   2|   b|
+----+----+

-- inline_outer
SELECT inline_outer(array(struct(1, 'a'), struct(2, 'b')));
+----+----+
|col1|col2|
+----+----+
|   1|   a|
|   2|   b|
+----+----+

-- posexplode
SELECT posexplode(array(10,20));
+---+---+
|pos|col|
+---+---+
|  0| 10|
|  1| 20|
+---+---+

SELECT * FROM posexplode(array(10,20));
+---+---+
|pos|col|
+---+---+
|  0| 10|
|  1| 20|
+---+---+

-- posexplode_outer
SELECT posexplode_outer(array(10,20));
+---+---+
|pos|col|
+---+---+
|  0| 10|
|  1| 20|
+---+---+

SELECT * FROM posexplode_outer(array(10,20));
+---+---+
|pos|col|
+---+---+
|  0| 10|
|  1| 20|
+---+---+

-- stack
SELECT stack(2, 1, 2, 3);
+----+----+
|col0|col1|
+----+----+
|   1|   2|
|   3|NULL|
+----+----+
```

#### Clause SELECT
<a name="supported-sql-select"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

OpenSearch SQL prend en charge une `SELECT` instruction utilisée pour récupérer des ensembles de résultats à partir d'une ou de plusieurs tables. La section suivante décrit la syntaxe globale des requêtes et les différentes constructions d'une requête.

**Syntaxe** 

```
select_statement 
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select_statement, ... ]
[ ORDER BY 
    { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] 
    [ , ... ] 
    } 
]
[ SORT BY 
    { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] 
    [ , ... ] 
    } 
]
[ WINDOW { named_window [ , WINDOW named_window, ... ] } ]
[ LIMIT { ALL | expression } ]
```

While `select_statement` est défini comme suit :

```
SELECT [ ALL | DISTINCT ] { [ [ named_expression ] [ , ... ] ] }
FROM { from_item [ , ... ] }
[ PIVOT clause ]
[ UNPIVOT clause ]
[ LATERAL VIEW clause ] [ ... ]
[ WHERE boolean_expression ]
[ GROUP BY expression [ , ... ] ]
[ HAVING boolean_expression ]
```

 **Paramètres** 
+ **TOUS** 

  Sélectionne toutes les lignes correspondantes dans la relation et est activé par défaut. 
+ **DISTINCT** 

  Sélectionne toutes les lignes correspondantes dans la relation après avoir supprimé les doublons dans les résultats. 
+ **expression\$1nommée**

  Expression à laquelle un nom a été attribué. En général, il désigne une expression de colonne. 

  Syntaxe : `expression [[AS] alias]` 
+ **from\$1item**

  Relation entre les tables

  Relation d'adhésion

  Relation pivot

  Relation dépivotante

  Fonction Table-value

  Tableau en ligne

  `[ LATERAL ] ( Subquery )`
+ **PIVOT** 

  La `PIVOT` clause est utilisée pour la perspective des données. Vous pouvez obtenir les valeurs agrégées en fonction d'une valeur de colonne spécifique. 
+ **UNPIVOT** 

  La `UNPIVOT` clause transforme les colonnes en lignes. C'est l'inverse de`PIVOT`, sauf pour l'agrégation des valeurs. 
+ **VUE LATÉRALE**

  La `LATERAL VIEW` clause est utilisée conjointement avec des fonctions de génération telles que`EXPLODE`, qui généreront une table virtuelle contenant une ou plusieurs lignes.

  `LATERAL VIEW`appliquera les lignes à chaque ligne de sortie d'origine. 
+ **OÙ** 

  Filtre le résultat de la `FROM` clause en fonction des prédicats fournis. 
+ **GROUPER PAR**

  Spécifie les expressions utilisées pour regrouper les lignes. 

  Ceci est utilisé conjointement avec des fonctions d'agrégation (`MIN`,`MAX`,`COUNT`,`SUM`,`AVG`,, etc.) pour regrouper les lignes en fonction des expressions de regroupement et des valeurs agrégées de chaque groupe. 

  Lorsqu'une `FILTER` clause est attachée à une fonction d'agrégation, seules les lignes correspondantes sont transmises à cette fonction. 
+ **AYANT** 

  Spécifie les prédicats selon lesquels les lignes produites par `GROUP BY` sont filtrées. 

  La `HAVING` clause est utilisée pour filtrer les lignes une fois le regroupement effectué. 

  Si elle `HAVING` est spécifiée sans`GROUP BY`, elle indique une expression `GROUP BY` sans regroupement (agrégat global). 
+ **COMMANDER PAR**

  Spécifie l'ordre des lignes du jeu de résultats complet de la requête. 

  Les lignes de sortie sont ordonnées sur les partitions. 

  Ce paramètre s'exclut mutuellement `SORT BY` `DISTRIBUTE BY` et ne peut pas être spécifié ensemble. 
+ **TRIER PAR**

  Spécifie l'ordre selon lequel les lignes sont ordonnées au sein de chaque partition. 

  Ce paramètre s'exclut mutuellement `ORDER BY` et ne peut pas être spécifié ensemble. 
+ **LIMITE** 

  Spécifie le nombre maximum de lignes pouvant être renvoyées par une instruction ou une sous-requête. 

  Cette clause est principalement utilisée conjointement avec `ORDER BY` pour produire un résultat déterministe. 
+ **expression\$1booléenne**

  Spécifie toute expression dont le type de résultat est un booléen. 

  Deux expressions ou plus peuvent être combinées à l'aide des opérateurs logiques (`AND`,`OR`). 
+ **expression** 

  Spécifie une combinaison d'une ou de plusieurs valeurs, opérateurs et fonctions SQL qui permet d'évaluer une valeur. 
+ **fenêtre\$1nommée**

  Spécifie des alias pour une ou plusieurs spécifications de fenêtre source. 

  Les spécifications de la fenêtre source peuvent être référencées dans les définitions de fenêtre de la requête. 

#### Clause WHERE
<a name="supported-sql-where"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `WHERE` clause est utilisée pour limiter les résultats de la `FROM` clause d'une requête ou d'une sous-requête en fonction de la condition spécifiée. 

**Syntaxe** 

```
WHERE boolean_expression
```

**Paramètres**
+ **expression\$1booléenne** 

  Spécifie toute expression dont le type de résultat est un booléen. 

  Deux expressions ou plus peuvent être combinées à l'aide des opérateurs logiques (`AND`,`OR`). 

**Exemples**

```
CREATE TABLE person (id INT, name STRING, age INT);
INSERT INTO person VALUES
(100, 'John', 30),
(200, 'Mary', NULL),
(300, 'Mike', 80),
(400, 'Dan',  50);

-- Comparison operator in `WHERE` clause.
SELECT * FROM person WHERE id > 200 ORDER BY id;
+---+----+---+
| id|name|age|
+---+----+---+
|300|Mike| 80|
|400| Dan| 50|
+---+----+---+

-- Comparison and logical operators in `WHERE` clause.
SELECT * FROM person WHERE id = 200 OR id = 300 ORDER BY id;
+---+----+----+
| id|name| age|
+---+----+----+
|200|Mary|null|
|300|Mike|  80|
+---+----+----+

-- IS NULL expression in `WHERE` clause.
SELECT * FROM person WHERE id > 300 OR age IS NULL ORDER BY id;
+---+----+----+
| id|name| age|
+---+----+----+
|200|Mary|null|
|400| Dan|  50|
+---+----+----+

-- Function expression in `WHERE` clause.
SELECT * FROM person WHERE length(name) > 3 ORDER BY id;
+---+----+----+
| id|name| age|
+---+----+----+
|100|John|  30|
|200|Mary|null|
|300|Mike|  80|
+---+----+----+

-- `BETWEEN` expression in `WHERE` clause.
SELECT * FROM person WHERE id BETWEEN 200 AND 300 ORDER BY id;
+---+----+----+
| id|name| age|
+---+----+----+
|200|Mary|null|
|300|Mike|  80|
+---+----+----+

-- Scalar Subquery in `WHERE` clause.
SELECT * FROM person WHERE age > (SELECT avg(age) FROM person);
+---+----+---+
| id|name|age|
+---+----+---+
|300|Mike| 80|
+---+----+---+
 
-- Correlated Subquery in `WHERE` clause.
SELECT id FROM person
WHERE exists (SELECT id FROM person where id = 200);
+---+----+----+
|id |name|age |
+---+----+----+
|200|Mary|null|
+---+----+----+
```

#### Clause GROUP BY
<a name="supported-sql-group-by"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `GROUP BY` clause est utilisée pour regrouper les lignes en fonction d'un ensemble d'expressions de regroupement spécifiées et pour calculer des agrégations sur le groupe de lignes en fonction d'une ou de plusieurs fonctions d'agrégation spécifiées. 

Le système effectue également plusieurs agrégations pour le même ensemble d'enregistrements d'entrée via des `ROLLUP` clauses `GROUPING SETS``CUBE`,. Les expressions de regroupement et les agrégations avancées peuvent être mélangées dans la `GROUP BY` clause et imbriquées dans une `GROUPING SETS ` clause. Voir plus de détails dans la `Mixed/Nested Grouping Analytics ` section. 

Lorsqu'une `FILTER` clause est attachée à une fonction d'agrégation, seules les lignes correspondantes sont transmises à cette fonction. 

**Syntaxe** 

```
GROUP BY group_expression [ , group_expression [ , ... ] ] [ WITH { ROLLUP | CUBE } ]
GROUP BY { group_expression | { ROLLUP | CUBE | GROUPING SETS } (grouping_set [ , ...]) } [ , ... ]
```

Alors que les fonctions d'agrégation sont définies comme suit : 

```
aggregate_name ( [ DISTINCT ] expression [ , ... ] ) [ FILTER ( WHERE boolean_expression ) ]
```

**Paramètres**
+ **expression\$1groupe**

  Spécifie les critères selon lesquels les lignes sont regroupées. Le regroupement des lignes est effectué en fonction des valeurs de résultat des expressions de regroupement. 

  Une expression de regroupement peut être un nom de colonne`GROUP BY a`, une position de colonne ou une expression similaire`GROUP BY a + b`. `GROUP BY 0` 
+ **grouping\$1set**

  Un ensemble de regroupement est spécifié par zéro ou plusieurs expressions séparées par des virgules entre parenthèses. Lorsque l'ensemble de regroupement ne comporte qu'un seul élément, les parenthèses peuvent être omises. 

  Par exemple, `GROUPING SETS ((a), (b))` est identique à `GROUPING SETS (a, b)`. 

  Syntaxe : `{ ( [ expression [ , ... ] ] ) | expression }` 
+ **ENSEMBLES DE REGROUPEMENT**

  Regroupe les lignes pour chaque ensemble de regroupement spécifié par la suite`GROUPING SETS`. 

  Par exemple, `GROUP BY GROUPING SETS ((warehouse), (product))` est sémantiquement équivalent à l'union des résultats de `GROUP BY warehouse` et. `GROUP BY product` Cette clause est un raccourci pour un UNION ALL dans lequel chaque étape de l'`UNION ALL`opérateur effectue l'agrégation de chaque ensemble de groupes spécifié dans la `GROUPING SETS` clause. 

  De même, `GROUP BY GROUPING SETS ((warehouse, product), (product), ())` est sémantiquement équivalent à l'union des résultats d'`GROUP BY warehouse, product, GROUP BY product`un agrégat global. 
+ **ROLLUP** 

  Spécifie plusieurs niveaux d'agrégation dans une seule instruction. Cette clause est utilisée pour calculer des agrégations basées sur plusieurs ensembles de regroupement. `ROLLUP`est un raccourci pour. `GROUPING SETS` 

  Par exemple, `GROUP BY warehouse, product WITH ROLLUP or GROUP BY ROLLUP(warehouse, product)` équivaut à `GROUP BY GROUPING SETS((warehouse, product), (warehouse), ())`. 

  `GROUP BY ROLLUP(warehouse, product, (warehouse, location))` est équivalent à `GROUP BY GROUPING SETS((warehouse, product, location), (warehouse, product), (warehouse), ())`.

  Les N éléments d'une spécification ROLLUP se traduisent par N\$11 ENSEMBLES DE REGROUPEMENT. 
+ **CUBE** 

  La clause CUBE est utilisée pour effectuer des agrégations basées sur une combinaison de colonnes de regroupement spécifiée dans la clause GROUP BY. CUBE est un raccourci pour GROUPER DES ENSEMBLES. 

  Par exemple, `GROUP BY warehouse, product WITH CUBE or GROUP BY CUBE(warehouse, product)` équivaut à `GROUP BY GROUPING SETS((warehouse, product), (warehouse), (product), ())`. 

  `GROUP BY CUBE(warehouse, product, (warehouse, location))` est équivalent à `GROUP BY GROUPING SETS((warehouse, product, location), (warehouse, product), (warehouse, location), (product, warehouse, location), (warehouse), (product), (warehouse, product), ())`. Les N éléments d'une `CUBE` spécification donnent `GROUPING SETS` 2^N. 
+ **Analyse des groupes mixtes/imbriqués**

  Une `GROUP BY` clause peut inclure plusieurs group\$1expressions et plusieurs. `CUBE|ROLLUP|GROUPING SETS` `GROUPING SETS`peut également comporter des `CUBE|ROLLUP|GROUPING SETS` clauses imbriquées, telles que`GROUPING SETS(ROLLUP(warehouse, location)`,`CUBE(warehouse, location))`, `GROUPING SETS(warehouse, GROUPING SETS(location, GROUPING SETS(ROLLUP(warehouse, location),``CUBE(warehouse, location))))`. 

  `CUBE|ROLLUP`est juste un sucre de syntaxe pour`GROUPING SETS`. Reportez-vous aux sections ci-dessus pour savoir comment traduire `CUBE|ROLLUP` en`GROUPING SETS`. `group_expression`peut être traité comme un seul groupe `GROUPING SETS` dans ce contexte. 

  Pour un multiple `GROUPING SETS` dans la `GROUP BY` clause, nous générons un seul `GROUPING SETS` en faisant un produit croisé de l'original`GROUPING SETS`. Pour imbriquer `GROUPING SETS` dans la `GROUPING SETS` clause, il suffit de prendre ses ensembles de regroupement et de les supprimer. 

  Par exemple, `GROUP BY warehouse, GROUPING SETS((product), ()), GROUPING SETS((location, size), (location), (size), ()) and GROUP BY warehouse, ROLLUP(product), CUBE(location, size)` équivaut à `GROUP BY GROUPING SETS( (warehouse, product, location, size), (warehouse, product, location), (warehouse, product, size), (warehouse, product), (warehouse, location, size), (warehouse, location), (warehouse, size), (warehouse))`. 

  `GROUP BY GROUPING SETS(GROUPING SETS(warehouse), GROUPING SETS((warehouse, product)))` est équivalent à `GROUP BY GROUPING SETS((warehouse), (warehouse, product))`. 
+ **nom\$1agrégat**

  Spécifie le nom d'une fonction d'agrégation (`MIN``MAX``COUNT``SUM`,`AVG`,,,, etc.). 
+ **DISTINCT** 

  Supprime les doublons dans les lignes d'entrée avant qu'ils ne soient transmis aux fonctions d'agrégation. 
+ **FILTRE** 

  Filtres : les lignes d'entrée pour lesquelles la `WHERE` clause `boolean_expression` in the est évaluée à true sont transmises à la fonction d'agrégation ; les autres lignes sont ignorées. 

**Exemples**

```
CREATE TABLE dealer (id INT, city STRING, car_model STRING, quantity INT);
INSERT INTO dealer VALUES
(100, 'Fremont', 'Honda Civic', 10),
(100, 'Fremont', 'Honda Accord', 15),
(100, 'Fremont', 'Honda CRV', 7),
(200, 'Dublin', 'Honda Civic', 20),
(200, 'Dublin', 'Honda Accord', 10),
(200, 'Dublin', 'Honda CRV', 3),
(300, 'San Jose', 'Honda Civic', 5),
(300, 'San Jose', 'Honda Accord', 8);

-- Sum of quantity per dealership. Group by `id`.
SELECT id, sum(quantity) FROM dealer GROUP BY id ORDER BY id;
+---+-------------+
| id|sum(quantity)|
+---+-------------+
|100|           32|
|200|           33|
|300|           13|
+---+-------------+

-- Use column position in GROUP by clause.
SELECT id, sum(quantity) FROM dealer GROUP BY 1 ORDER BY 1;
+---+-------------+
| id|sum(quantity)|
+---+-------------+
|100|           32|
|200|           33|
|300|           13|
+---+-------------+

-- Multiple aggregations.
-- 1. Sum of quantity per dealership.
-- 2. Max quantity per dealership.
SELECT id, sum(quantity) AS sum, max(quantity) AS max FROM dealer GROUP BY id ORDER BY id;
+---+---+---+
| id|sum|max|
+---+---+---+
|100| 32| 15|
|200| 33| 20|
|300| 13|  8|
+---+---+---+

-- Count the number of distinct dealer cities per car_model.
SELECT car_model, count(DISTINCT city) AS count FROM dealer GROUP BY car_model;
+------------+-----+
|   car_model|count|
+------------+-----+
| Honda Civic|    3|
|   Honda CRV|    2|
|Honda Accord|    3|
+------------+-----+

-- Sum of only 'Honda Civic' and 'Honda CRV' quantities per dealership.
SELECT id, sum(quantity) FILTER (
WHERE car_model IN ('Honda Civic', 'Honda CRV')
) AS `sum(quantity)` FROM dealer
GROUP BY id ORDER BY id;
+---+-------------+
| id|sum(quantity)|
+---+-------------+
|100|           17|
|200|           23|
|300|            5|
+---+-------------+

-- Aggregations using multiple sets of grouping columns in a single statement.
-- Following performs aggregations based on four sets of grouping columns.
-- 1. city, car_model
-- 2. city
-- 3. car_model
-- 4. Empty grouping set. Returns quantities for all city and car models.
SELECT city, car_model, sum(quantity) AS sum FROM dealer
GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), ())
ORDER BY city;
+---------+------------+---+
|     city|   car_model|sum|
+---------+------------+---+
|     null|        null| 78|
|     null| HondaAccord| 33|
|     null|    HondaCRV| 10|
|     null|  HondaCivic| 35|
|   Dublin|        null| 33|
|   Dublin| HondaAccord| 10|
|   Dublin|    HondaCRV|  3|
|   Dublin|  HondaCivic| 20|
|  Fremont|        null| 32|
|  Fremont| HondaAccord| 15|
|  Fremont|    HondaCRV|  7|
|  Fremont|  HondaCivic| 10|
| San Jose|        null| 13|
| San Jose| HondaAccord|  8|
| San Jose|  HondaCivic|  5|
+---------+------------+---+

-- Group by processing with `ROLLUP` clause.
-- Equivalent GROUP BY GROUPING SETS ((city, car_model), (city), ())
SELECT city, car_model, sum(quantity) AS sum FROM dealer
GROUP BY city, car_model WITH ROLLUP
ORDER BY city, car_model;
+---------+------------+---+
|     city|   car_model|sum|
+---------+------------+---+
|     null|        null| 78|
|   Dublin|        null| 33|
|   Dublin| HondaAccord| 10|
|   Dublin|    HondaCRV|  3|
|   Dublin|  HondaCivic| 20|
|  Fremont|        null| 32|
|  Fremont| HondaAccord| 15|
|  Fremont|    HondaCRV|  7|
|  Fremont|  HondaCivic| 10|
| San Jose|        null| 13|
| San Jose| HondaAccord|  8|
| San Jose|  HondaCivic|  5|
+---------+------------+---+

-- Group by processing with `CUBE` clause.
-- Equivalent GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), ())
SELECT city, car_model, sum(quantity) AS sum FROM dealer
GROUP BY city, car_model WITH CUBE
ORDER BY city, car_model;
+---------+------------+---+
|     city|   car_model|sum|
+---------+------------+---+
|     null|        null| 78|
|     null| HondaAccord| 33|
|     null|    HondaCRV| 10|
|     null|  HondaCivic| 35|
|   Dublin|        null| 33|
|   Dublin| HondaAccord| 10|
|   Dublin|    HondaCRV|  3|
|   Dublin|  HondaCivic| 20|
|  Fremont|        null| 32|
|  Fremont| HondaAccord| 15|
|  Fremont|    HondaCRV|  7|
|  Fremont|  HondaCivic| 10|
| San Jose|        null| 13|
| San Jose| HondaAccord|  8|
| San Jose|  HondaCivic|  5|
+---------+------------+---+

--Prepare data for ignore nulls example
CREATE TABLE person (id INT, name STRING, age INT);
INSERT INTO person VALUES
(100, 'Mary', NULL),
(200, 'John', 30),
(300, 'Mike', 80),
(400, 'Dan', 50);

--Select the first row in column age
SELECT FIRST(age) FROM person;
+--------------------+
| first(age, false)  |
+--------------------+
| NULL               |
+--------------------+

--Get the first row in column `age` ignore nulls,last row in column `id` and sum of column `id`.
SELECT FIRST(age IGNORE NULLS), LAST(id), SUM(id) FROM person;
+-------------------+------------------+----------+
| first(age, true)  | last(id, false)  | sum(id)  |
+-------------------+------------------+----------+
| 30                | 400              | 1000     |
+-------------------+------------------+----------+
```

#### Clause HAVING
<a name="supported-sql-having"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `HAVING` clause est utilisée pour filtrer les résultats produits par en `GROUP BY` fonction de la condition spécifiée. Il est souvent utilisé en conjonction avec une `GROUP BY` clause. 

**Syntaxe** 

```
HAVING boolean_expression
```

**Paramètres**
+ **expression\$1booléenne**

  Spécifie toute expression dont le type de résultat est un booléen. Deux expressions ou plus peuvent être combinées à l'aide des opérateurs logiques (`AND`,`OR`). 

  **Remarque** Les expressions spécifiées dans la `HAVING` clause peuvent uniquement faire référence à : 

  1. Constantes 

  1. Expressions qui apparaissent dans `GROUP BY` 

  1. Fonctions d’agrégation 

**Exemples**

```
CREATE TABLE dealer (id INT, city STRING, car_model STRING, quantity INT);
INSERT INTO dealer VALUES
(100, 'Fremont', 'Honda Civic', 10),
(100, 'Fremont', 'Honda Accord', 15),
(100, 'Fremont', 'Honda CRV', 7),
(200, 'Dublin', 'Honda Civic', 20),
(200, 'Dublin', 'Honda Accord', 10),
(200, 'Dublin', 'Honda CRV', 3),
(300, 'San Jose', 'Honda Civic', 5),
(300, 'San Jose', 'Honda Accord', 8);

-- `HAVING` clause referring to column in `GROUP BY`.
SELECT city, sum(quantity) AS sum FROM dealer GROUP BY city HAVING city = 'Fremont';
+-------+---+
|   city|sum|
+-------+---+
|Fremont| 32|
+-------+---+

-- `HAVING` clause referring to aggregate function.
SELECT city, sum(quantity) AS sum FROM dealer GROUP BY city HAVING sum(quantity) > 15;
+-------+---+
|   city|sum|
+-------+---+
| Dublin| 33|
|Fremont| 32|
+-------+---+

-- `HAVING` clause referring to aggregate function by its alias.
SELECT city, sum(quantity) AS sum FROM dealer GROUP BY city HAVING sum > 15;
+-------+---+
|   city|sum|
+-------+---+
| Dublin| 33|
|Fremont| 32|
+-------+---+

-- `HAVING` clause referring to a different aggregate function than what is present in
-- `SELECT` list.
SELECT city, sum(quantity) AS sum FROM dealer GROUP BY city HAVING max(quantity) > 15;
+------+---+
|  city|sum|
+------+---+
|Dublin| 33|
+------+---+

-- `HAVING` clause referring to constant expression.
SELECT city, sum(quantity) AS sum FROM dealer GROUP BY city HAVING 1 > 0 ORDER BY city;
+--------+---+
|    city|sum|
+--------+---+
|  Dublin| 33|
| Fremont| 32|
|San Jose| 13|
+--------+---+

-- `HAVING` clause without a `GROUP BY` clause.
SELECT sum(quantity) AS sum FROM dealer HAVING sum(quantity) > 10;
+---+
|sum|
+---+
| 78|
+---+
```

#### Clause ORDER BY
<a name="supported-sql-order-by"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `ORDER BY` clause est utilisée pour renvoyer les lignes de résultats de manière triée dans l'ordre spécifié par l'utilisateur. Contrairement à la clause SORT BY, cette clause garantit un ordre total dans la sortie. 

**Syntaxe** 

```
ORDER BY { expression [ sort_direction | nulls_sort_order ] [ , ... ] }
```

**Paramètres**
+ **COMMANDER PAR**

  Spécifie une liste d'expressions séparées par des virgules ainsi que des paramètres `sort_direction` `nulls_sort_order` facultatifs utilisés pour trier les lignes. 
+ **direction\$1tri**

  Spécifie éventuellement s'il faut trier les lignes par ordre croissant ou décroissant. 

  Les valeurs valides pour le sens de tri sont `ASC` pour le sens ascendant et `DESC` pour le sens descendant. 

  Si le sens de tri n'est pas explicitement spécifié, les lignes sont triées par défaut dans l'ordre croissant. 

  Syntaxe : `[ ASC | DESC ] `
+ **nulls\$1sort\$1order**

  Spécifie éventuellement si `NULL` les valeurs renvoyées sont des valeurs before/after non nulles. 

  Si null\$1sort\$1order n'est pas spécifié, triez d'abord si l'ordre de `NULLs` tri est le cas `ASC` et NULLS trie en dernier si l'ordre de tri l'est. `DESC` 

  1. Si elle `NULLS FIRST` est spécifiée, les valeurs NULL sont renvoyées en premier, quel que soit l'ordre de tri. 

  2. Si elle `NULLS LAST` est spécifiée, les valeurs NULL sont renvoyées en dernier, quel que soit l'ordre de tri. 

  Syntaxe : `[ NULLS { FIRST | LAST } ]` 

**Exemples**

```
CREATE TABLE person (id INT, name STRING, age INT);
INSERT INTO person VALUES
(100, 'John', 30),
(200, 'Mary', NULL),
(300, 'Mike', 80),
(400, 'Jerry', NULL),
(500, 'Dan',  50);

-- Sort rows by age. By default rows are sorted in ascending manner with NULL FIRST.
SELECT name, age FROM person ORDER BY age;
+-----+----+
| name| age|
+-----+----+
|Jerry|null|
| Mary|null|
| John|  30|
|  Dan|  50|
| Mike|  80|
+-----+----+

-- Sort rows in ascending manner keeping null values to be last.
SELECT name, age FROM person ORDER BY age NULLS LAST;
+-----+----+
| name| age|
+-----+----+
| John|  30|
|  Dan|  50|
| Mike|  80|
| Mary|null|
|Jerry|null|
+-----+----+

-- Sort rows by age in descending manner, which defaults to NULL LAST.
SELECT name, age FROM person ORDER BY age DESC;
+-----+----+
| name| age|
+-----+----+
| Mike|  80|
|  Dan|  50|
| John|  30|
|Jerry|null|
| Mary|null|
+-----+----+

-- Sort rows in ascending manner keeping null values to be first.
SELECT name, age FROM person ORDER BY age DESC NULLS FIRST;
+-----+----+
| name| age|
+-----+----+
|Jerry|null|
| Mary|null|
| Mike|  80|
|  Dan|  50|
| John|  30|
+-----+----+

-- Sort rows based on more than one column with each column having different
-- sort direction.
SELECT * FROM person ORDER BY name ASC, age DESC;
+---+-----+----+
| id| name| age|
+---+-----+----+
|500|  Dan|  50|
|400|Jerry|null|
|100| John|  30|
|200| Mary|null|
|300| Mike|  80|
+---+-----+----+
```

#### Clause JOIN
<a name="supported-sql-join"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

Une jointure SQL est utilisée pour combiner les lignes de deux relations en fonction de critères de jointure. La section suivante décrit la syntaxe globale des jointures et les différents types de jointures, ainsi que des exemples. 

**Syntaxe** 

```
relation INNER JOIN relation [ join_criteria ]
```

**Paramètres**
+ **relation**

  Spécifie la relation à joindre. 
+ **type de jointure**

  Spécifie le type de jointure. 

  Syntaxe : `INNER | CROSS | LEFT OUTER`
+ **join\$1criteria**

  Spécifie la manière dont les lignes d'une relation seront combinées avec les lignes d'une autre relation. 

  Syntaxe : `ON boolean_expression | USING ( column_name [ , ... ] ) `
+ **expression\$1booléenne**

  Spécifie une expression dont le type de retour est booléen. 

**Types de jointure**
+ **Jointure intérieure**

  La jointure interne doit être spécifiée explicitement. Il sélectionne les lignes dont les valeurs correspondent dans les deux relations.

  Syntaxe : `relation INNER JOIN relation [ join_criteria ] `
+ **Jointure gauche**

  Une jointure gauche renvoie toutes les valeurs de la relation de gauche et les valeurs correspondantes de la relation de droite, ou ajoute la valeur NULL en cas d'absence de correspondance. Elle est également appelée jointure extérieure gauche. 

  Syntaxe : `relation LEFT OUTER JOIN relation [ join_criteria ]` 
+ **Jointure croisée**

  Une jointure croisée renvoie le produit cartésien de deux relations. 

  Syntaxe : `relation CROSS JOIN relation [ join_criteria ]` 

**Exemples**

```
-- Use employee and department tables to demonstrate different type of joins.
SELECT * FROM employee;
+---+-----+------+
| id| name|deptno|
+---+-----+------+
|105|Chloe|     5|
|103| Paul|     3|
|101| John|     1|
|102| Lisa|     2|
|104| Evan|     4|
|106|  Amy|     6|
+---+-----+------+
SELECT * FROM department;
+------+-----------+
|deptno|   deptname|
+------+-----------+
|     3|Engineering|
|     2|      Sales|
|     1|  Marketing|
+------+-----------+

-- Use employee and department tables to demonstrate inner join.
SELECT id, name, employee.deptno, deptname
FROM employee INNER JOIN department ON employee.deptno = department.deptno;
+---+-----+------+-----------|
| id| name|deptno|   deptname|
+---+-----+------+-----------|
|103| Paul|     3|Engineering|
|101| John|     1|  Marketing|
|102| Lisa|     2|      Sales|
+---+-----+------+-----------|

-- Use employee and department tables to demonstrate left join.
SELECT id, name, employee.deptno, deptname
FROM employee LEFT JOIN department ON employee.deptno = department.deptno;
+---+-----+------+-----------|
| id| name|deptno|   deptname|
+---+-----+------+-----------|
|105|Chloe|     5|       NULL|
|103| Paul|     3|Engineering|
|101| John|     1|  Marketing|
|102| Lisa|     2|      Sales|
|104| Evan|     4|       NULL|
|106|  Amy|     6|       NULL|
+---+-----+------+-----------|

-- Use employee and department tables to demonstrate cross join.
SELECT id, name, employee.deptno, deptname FROM employee CROSS JOIN department;
+---+-----+------+-----------|
| id| name|deptno|   deptname|
+---+-----+------+-----------|
|105|Chloe|     5|Engineering|
|105|Chloe|     5|  Marketing|
|105|Chloe|     5|      Sales|
|103| Paul|     3|Engineering|
|103| Paul|     3|  Marketing|
|103| Paul|     3|      Sales|
|101| John|     1|Engineering|
|101| John|     1|  Marketing|
|101| John|     1|      Sales|
|102| Lisa|     2|Engineering|
|102| Lisa|     2|  Marketing|
|102| Lisa|     2|      Sales|
|104| Evan|     4|Engineering|
|104| Evan|     4|  Marketing|
|104| Evan|     4|      Sales|
|106|  Amy|     4|Engineering|
|106|  Amy|     4|  Marketing|
|106|  Amy|     4|      Sales|
+---+-----+------+-----------|
```

#### Clause LIMIT
<a name="supported-sql-limit"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `LIMIT` clause est utilisée pour limiter le nombre de lignes renvoyées par l'`SELECT`instruction. En général, cette clause est utilisée conjointement `ORDER BY` pour garantir que les résultats sont déterministes. 

**Syntaxe** 

```
LIMIT { ALL | integer_expression }
```

**Paramètres**
+ **TOUS**

  Si elle est spécifiée, la requête renvoie toutes les lignes. En d'autres termes, aucune limite n'est appliquée si cette option est spécifiée. 
+ **expression\$1entière**

  Spécifie une expression pliable qui renvoie un entier. 

**Exemples**

```
CREATE TABLE person (name STRING, age INT);
INSERT INTO person VALUES
('Jane Doe', 25),
('Pat C', 18),
('Nikki W', 16),
('John D', 25),
('Juan L', 18),
('Jorge S', 16);

-- Select the first two rows.
SELECT name, age FROM person ORDER BY name LIMIT 2;
+-------+---+
|   name|age|
+-------+---+
|  Pat C| 18|
|Jorge S| 16|
+------+---+

-- Specifying ALL option on LIMIT returns all the rows.
SELECT name, age FROM person ORDER BY name LIMIT ALL;
+--------+---+
|    name|age|
+--------+---+
|   Pat C| 18|
| Jorge S| 16|
|  Juan L| 18|
|  John D| 25|
| Nikki W| 16|
|Jane Doe| 25|
+--------+---+

-- A function expression as an input to LIMIT.
SELECT name, age FROM person ORDER BY name LIMIT length('OPENSEARCH');
+-------+---+
|   name|age|
+-------+---+
|  Pat C| 18|
|Jorge S| 16|
| Juan L| 18|
| John D| 25|
|Nikki W| 16|
+-------+---+
```

#### Clause CASE
<a name="supported-sql-case"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `CASE` clause utilise une règle pour renvoyer un résultat spécifique en fonction de la condition spécifiée, comme dans les instructions if/else dans d'autres langages de programmation. 

**Syntaxe** 

```
CASE [ expression ] { WHEN boolean_expression THEN then_expression } [ ... ]
[ ELSE else_expression ]
END
```

**Paramètres**
+ **expression\$1booléenne**

  Spécifie toute expression dont le type de résultat est un booléen. 

  Deux expressions ou plus peuvent être combinées à l'aide des opérateurs logiques (`AND`,`OR`). 
+ **puis expression**

  Spécifie l'expression alors en fonction de la condition boolean\$1expression.

  `then_expression`et `else_expression` doivent tous être du même type ou être soumis à un type commun. 
+ **autre expression**

  Spécifie l'expression par défaut.

  `then_expression`et ` else_expression` doivent tous être du même type ou être soumis à un type commun. 

**Exemples**

```
CREATE TABLE person (id INT, name STRING, age INT);
INSERT INTO person VALUES
(100, 'John', 30),
(200, 'Mary', NULL),
(300, 'Mike', 80),
(400, 'Dan', 50);
SELECT id, CASE WHEN id > 200 THEN 'bigger' ELSE 'small' END FROM person;
+------+--------------------------------------------------+
|  id  | CASE WHEN (id > 200) THEN bigger ELSE small END  |
+------+--------------------------------------------------+
| 100  | small                                            |
| 200  | small                                            |
| 300  | bigger                                           |
| 400  | bigger                                           |
+------+--------------------------------------------------+
SELECT id, CASE id WHEN 100 then 'bigger' WHEN  id > 300 THEN '300' ELSE 'small' END FROM person;
+------+-----------------------------------------------------------------------------------------------+
|  id  | CASE WHEN (id = 100) THEN bigger WHEN (id = CAST((id > 300) AS INT)) THEN 300 ELSE small END  |
+------+-----------------------------------------------------------------------------------------------+
| 100  | bigger                                                                                        |
| 200  | small                                                                                         |
| 300  | small                                                                                         |
| 400  | small                                                                                         |
+------+-----------------------------------------------------------------------------------------------+
```

#### Expression de table commune
<a name="supported-sql-cte"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

Une expression de table commune (CTE) définit un jeu de résultats temporaire auquel un utilisateur peut éventuellement faire référence plusieurs fois dans le cadre d'une instruction SQL. Un CTE est principalement utilisé dans une `SELECT` déclaration. 

**Syntaxe** 

```
WITH common_table_expression [ , ... ]
```

While `common_table_expression` est défini comme suit :

```
Syntexpression_name [ ( column_name [ , ... ] ) ] [ AS ] ( query )
```

**Paramètres** 
+ **nom\$1expression**

  Spécifie le nom de l'expression de table commune. 
+ **query** 

  Une `SELECT` déclaration. 

**Exemples**

```
-- CTE with multiple column aliases
WITH t(x, y) AS (SELECT 1, 2)
SELECT * FROM t WHERE x = 1 AND y = 2;
+---+---+
|  x|  y|
+---+---+
|  1|  2|
+---+---+

-- CTE in CTE definition
WITH t AS (
WITH t2 AS (SELECT 1)
SELECT * FROM t2
)
SELECT * FROM t;
+---+
|  1|
+---+
|  1|
+---+

-- CTE in subquery
SELECT max(c) FROM (
WITH t(c) AS (SELECT 1)
SELECT * FROM t
);
+------+
|max(c)|
+------+
|     1|
+------+

-- CTE in subquery expression
SELECT (
WITH t AS (SELECT 1)
SELECT * FROM t
);
+----------------+
|scalarsubquery()|
+----------------+
|               1|
+----------------+

-- CTE in CREATE VIEW statement
CREATE VIEW v AS
WITH t(a, b, c, d) AS (SELECT 1, 2, 3, 4)
SELECT * FROM t;
SELECT * FROM v;
+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  1|  2|  3|  4|
+---+---+---+---+
```

#### EXPLAIN
<a name="supported-sql-explain"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

L'`EXPLAIN`instruction est utilisée pour fournir des plans logiques/physiques pour une instruction d'entrée. Par défaut, cette clause fournit uniquement des informations sur un plan physique. 

**Syntaxe** 

```
EXPLAIN [ EXTENDED | CODEGEN | COST | FORMATTED ] statement
```

**Paramètres**
+ **ÉTENDU** 

  Génère un plan logique analysé, un plan logique analysé, un plan logique optimisé et un plan physique. 

  Le plan logique analysé est un plan non résolu extrait de la requête. 

  Les plans logiques analysés transforment ce qui se traduit `unresolvedAttribute` `unresolvedRelation` en objets entièrement typés. 

  Le plan logique optimisé est transformé par le biais d'un ensemble de règles d'optimisation, aboutissant au plan physique. 
+ **CODEGEN** 

  Génère du code pour l'instruction, le cas échéant, ainsi qu'un plan physique. 
+ **COÛT** 

  Si les statistiques des nœuds du plan sont disponibles, génère un plan logique et les statistiques. 
+ **FORMATÉ** 

  Génère deux sections : le plan physique et les détails du nœud. 
+ **déclaration** 

  Spécifie une instruction SQL à expliquer. 

**Exemples**

```
-- Default Output
EXPLAIN select k, sum(v) from values (1, 2), (1, 3) t(k, v) group by k;
+----------------------------------------------------+
|                                                plan|
+----------------------------------------------------+
| == Physical Plan ==
*(2) HashAggregate(keys=[k#33], functions=[sum(cast(v#34 as bigint))])
+- Exchange hashpartitioning(k#33, 200), true, [id=#59]
+- *(1) HashAggregate(keys=[k#33], functions=[partial_sum(cast(v#34 as bigint))])
+- *(1) LocalTableScan [k#33, v#34]
|
+----------------------------------------------------

-- Using Extended
EXPLAIN EXTENDED select k, sum(v) from values (1, 2), (1, 3) t(k, v) group by k;
+----------------------------------------------------+
|                                                plan|
+----------------------------------------------------+
| == Parsed Logical Plan ==
'Aggregate ['k], ['k, unresolvedalias('sum('v), None)]
 +- 'SubqueryAlias `t`
+- 'UnresolvedInlineTable [k, v], [List(1, 2), List(1, 3)]
   
 == Analyzed Logical Plan ==
 k: int, sum(v): bigint
 Aggregate [k#47], [k#47, sum(cast(v#48 as bigint)) AS sum(v)#50L]
 +- SubqueryAlias `t`
    +- LocalRelation [k#47, v#48]
   
 == Optimized Logical Plan ==
 Aggregate [k#47], [k#47, sum(cast(v#48 as bigint)) AS sum(v)#50L]
 +- LocalRelation [k#47, v#48]
   
 == Physical Plan ==
 *(2) HashAggregate(keys=[k#47], functions=[sum(cast(v#48 as bigint))], output=[k#47, sum(v)#50L])
+- Exchange hashpartitioning(k#47, 200), true, [id=#79]
   +- *(1) HashAggregate(keys=[k#47], functions=[partial_sum(cast(v#48 as bigint))], output=[k#47, sum#52L])
    +- *(1) LocalTableScan [k#47, v#48]
|
+----------------------------------------------------+

-- Using Formatted
EXPLAIN FORMATTED select k, sum(v) from values (1, 2), (1, 3) t(k, v) group by k;
+----------------------------------------------------+
|                                                plan|
+----------------------------------------------------+
| == Physical Plan ==
 * HashAggregate (4)
 +- Exchange (3)
    +- * HashAggregate (2)
       +- * LocalTableScan (1)
   
   
 (1) LocalTableScan [codegen id : 1]
 Output: [k#19, v#20]
        
 (2) HashAggregate [codegen id : 1]
 Input: [k#19, v#20]
        
 (3) Exchange
 Input: [k#19, sum#24L]
        
 (4) HashAggregate [codegen id : 2]
 Input: [k#19, sum#24L]
|
+----------------------------------------------------+
```

#### Clause LATERAL SUBQUERY
<a name="supported-sql-lateral-subquery"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

`LATERAL SUBQUERY`est une sous-requête précédée du mot clé`LATERAL`. Il permet de référencer les colonnes de la `FROM` clause précédente. Sans le `LATERAL` mot clé, les sous-requêtes ne peuvent faire référence qu'aux colonnes de la requête externe, mais pas à celles de la `FROM` clause. `LATERAL SUBQUERY`rend les requêtes complexes plus simples et plus efficaces. 

**Syntaxe** 

```
[ LATERAL ] primary_relation [ join_relation ]
```

**Paramètres**
+ **relation\$1primaire**

  Spécifie la relation principale. Il peut s'agir de l'un des périphériques suivants : 

  1. Relation entre les tables 

  1. Requête aliasée 

     Syntaxe : `( query ) [ [ AS ] alias ] `

  1. Relation aliasée 

     `Syntax: ( relation ) [ [ AS ] alias ]` 

**Exemples**

```
CREATE TABLE t1 (c1 INT, c2 INT);
INSERT INTO t1 VALUES (0, 1), (1, 2);
CREATE TABLE t2 (c1 INT, c2 INT);
INSERT INTO t2 VALUES (0, 2), (0, 3);
SELECT * FROM t1,
LATERAL (SELECT * FROM t2 WHERE t1.c1 = t2.c1);
+--------+-------+--------+-------+
|  t1.c1 | t1.c2 |  t2.c1 | t2.c2 |
+-------+--------+--------+-------+
|    0   |   1   |    0   |   3   |
|    0   |   1   |    0   |   2   |
+-------+--------+--------+-------+
SELECT a, b, c FROM t1,
LATERAL (SELECT c1 + c2 AS a),
LATERAL (SELECT c1 - c2 AS b),
LATERAL (SELECT a * b AS c);
+--------+-------+--------+
|    a   |   b   |    c   |
+-------+--------+--------+
|    3   |  -1   |   -3   |
|    1   |  -1   |   -1   |
+-------+--------+--------+
```

#### Clause de vue latérale
<a name="supported-sql-lateral-view"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `LATERAL VIEW` clause est utilisée conjointement avec des fonctions de génération telles que`EXPLODE`, qui généreront une table virtuelle contenant une ou plusieurs lignes. `LATERAL VIEW`appliquera les lignes à chaque ligne de sortie d'origine. 

**Syntaxe** 

```
LATERAL VIEW [ OUTER ] generator_function ( expression [ , ... ] ) [ table_alias ] AS column_alias [ , ... ]
```

**Paramètres**
+ **EXTÉRIEUR**

  Si `OUTER` spécifié, renvoie null si une entrée array/map est vide ou nulle. 
+ **fonction\$1générateur**

  Spécifie une fonction de générateur (`EXPLODE``INLINE`,, etc.). 
+ **alias de table**

  L'alias pour`generator_function`, qui est facultatif. 
+ **alias de colonne**

  Répertorie les alias de `generator_function` colonne qui peuvent être utilisés dans les lignes de sortie. 

  Vous pouvez avoir plusieurs alias s'il `generator_function` comporte plusieurs colonnes de sortie. 

**Exemples**

```
CREATE TABLE person (id INT, name STRING, age INT, class INT, address STRING);
INSERT INTO person VALUES
(100, 'John', 30, 1, 'Street 1'),
(200, 'Mary', NULL, 1, 'Street 2'),
(300, 'Mike', 80, 3, 'Street 3'),
(400, 'Dan', 50, 4, 'Street 4');
SELECT * FROM person
LATERAL VIEW EXPLODE(ARRAY(30, 60)) tableName AS c_age
LATERAL VIEW EXPLODE(ARRAY(40, 80)) AS d_age;
+------+-------+-------+--------+-----------+--------+--------+
|  id  | name  |  age  | class  |  address  | c_age  | d_age  |
+------+-------+-------+--------+-----------+--------+--------+
| 100  | John  | 30    | 1      | Street 1  | 30     | 40     |
| 100  | John  | 30    | 1      | Street 1  | 30     | 80     |
| 100  | John  | 30    | 1      | Street 1  | 60     | 40     |
| 100  | John  | 30    | 1      | Street 1  | 60     | 80     |
| 200  | Mary  | NULL  | 1      | Street 2  | 30     | 40     |
| 200  | Mary  | NULL  | 1      | Street 2  | 30     | 80     |
| 200  | Mary  | NULL  | 1      | Street 2  | 60     | 40     |
| 200  | Mary  | NULL  | 1      | Street 2  | 60     | 80     |
| 300  | Mike  | 80    | 3      | Street 3  | 30     | 40     |
| 300  | Mike  | 80    | 3      | Street 3  | 30     | 80     |
| 300  | Mike  | 80    | 3      | Street 3  | 60     | 40     |
| 300  | Mike  | 80    | 3      | Street 3  | 60     | 80     |
| 400  | Dan   | 50    | 4      | Street 4  | 30     | 40     |
| 400  | Dan   | 50    | 4      | Street 4  | 30     | 80     |
| 400  | Dan   | 50    | 4      | Street 4  | 60     | 40     |
| 400  | Dan   | 50    | 4      | Street 4  | 60     | 80     |
+------+-------+-------+--------+-----------+--------+--------+
SELECT c_age, COUNT(1) FROM person
LATERAL VIEW EXPLODE(ARRAY(30, 60)) AS c_age
LATERAL VIEW EXPLODE(ARRAY(40, 80)) AS d_age
GROUP BY c_age;
+--------+-----------+
| c_age  | count(1)  |
+--------+-----------+
| 60     | 8         |
| 30     | 8         |
+--------+-----------+
SELECT * FROM person
LATERAL VIEW EXPLODE(ARRAY()) tableName AS c_age;
+-----+-------+------+--------+----------+--------+
| id  | name  | age  | class  | address  | c_age  |
+-----+-------+------+--------+----------+--------+
+-----+-------+------+--------+----------+--------+
SELECT * FROM person
LATERAL VIEW OUTER EXPLODE(ARRAY()) tableName AS c_age;
+------+-------+-------+--------+-----------+--------+
|  id  | name  |  age  | class  |  address  | c_age  |
+------+-------+-------+--------+-----------+--------+
| 100  | John  | 30    | 1      | Street 1  | NULL   |
| 200  | Mary  | NULL  | 1      | Street 2  | NULL   |
| 300  | Mike  | 80    | 3      | Street 3  | NULL   |
| 400  | Dan   | 50    | 4      | Street 4  | NULL   |
+------+-------+-------+--------+-----------+--------+
```

#### Prédicat LIKE
<a name="supported-sql-like-predicate"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

Un `LIKE` prédicat est utilisé pour rechercher un modèle spécifique. Ce prédicat prend également en charge plusieurs modèles avec des quantificateurs tels que `ANY``SOME`, et. `ALL` 

**Syntaxe** 

```
[ NOT ] { LIKE search_pattern [ ESCAPE esc_char ] | [ RLIKE | REGEXP ] regex_pattern }
[ NOT ] { LIKE quantifiers ( search_pattern [ , ... ]) }
```

**Paramètres**
+ **modèle\$1de recherche**

  Spécifie un modèle de chaîne à rechercher par la clause LIKE. Il peut contenir des caractères spéciaux correspondant à des modèles : 
  + `%`correspond à zéro ou plusieurs caractères. 
  + `_`correspond exactement à un caractère. 
+ **esc\$1char**

  Spécifie le caractère échappe. Le caractère d'échappement par défaut est`\`. 
+ **modèle\$1régulier**

  Spécifie un modèle de recherche d'expressions régulières à rechercher par la `REGEXP` clause `RLIKE` or. 
+ **quantificateurs** 

  Spécifie que les quantificateurs de prédicats incluent`ANY`, et`SOME`. `ALL` 

  `ANY`ou `SOME` signifie que si l'un des modèles correspond à l'entrée, renvoie true.

  `ALL`signifie que si tous les modèles correspondent à l'entrée, alors renvoyez vrai. 

**Exemples**

```
CREATE TABLE person (id INT, name STRING, age INT);
INSERT INTO person VALUES
(100, 'John', 30),
(200, 'Mary', NULL),
(300, 'Mike', 80),
(400, 'Dan',  50),
(500, 'Evan_w', 16);
SELECT * FROM person WHERE name LIKE 'M%';
+---+----+----+
| id|name| age|
+---+----+----+
|300|Mike|  80|
|200|Mary|null|
+---+----+----+
SELECT * FROM person WHERE name LIKE 'M_ry';
+---+----+----+
| id|name| age|
+---+----+----+
|200|Mary|null|
+---+----+----+
SELECT * FROM person WHERE name NOT LIKE 'M_ry';
+---+------+---+
| id|  name|age|
+---+------+---+
|500|Evan_W| 16|
|300|  Mike| 80|
|100|  John| 30|
|400|   Dan| 50|
+---+------+---+
SELECT * FROM person WHERE name RLIKE 'M+';
+---+----+----+
| id|name| age|
+---+----+----+
|300|Mike|  80|
|200|Mary|null|
+---+----+----+
SELECT * FROM person WHERE name REGEXP 'M+';
+---+----+----+
| id|name| age|
+---+----+----+
|300|Mike|  80|
|200|Mary|null|
+---+----+----+
SELECT * FROM person WHERE name LIKE '%\_%';
+---+------+---+
| id|  name|age|
+---+------+---+
|500|Evan_W| 16|
+---+------+---+
SELECT * FROM person WHERE name LIKE '%$_%' ESCAPE '$';
+---+------+---+
| id|  name|age|
+---+------+---+
|500|Evan_W| 16|
+---+------+---+
SELECT * FROM person WHERE name LIKE ALL ('%an%', '%an');
+---+----+----+
| id|name| age|
+---+----+----+
|400| Dan|  50|
+---+----+----+
SELECT * FROM person WHERE name LIKE ANY ('%an%', '%an');
+---+------+---+
| id|  name|age|
+---+------+---+
|400|   Dan| 50|
|500|Evan_W| 16|
+---+------+---+
SELECT * FROM person WHERE name LIKE SOME ('%an%', '%an');
+---+------+---+
| id|  name|age|
+---+------+---+
|400|   Dan| 50|
|500|Evan_W| 16|
+---+------+---+
SELECT * FROM person WHERE name NOT LIKE ALL ('%an%', '%an');
+---+----+----+
| id|name| age|
+---+----+----+
|100|John|  30|
|200|Mary|null|
|300|Mike|  80|
+---+----+----+
SELECT * FROM person WHERE name NOT LIKE ANY ('%an%', '%an');
+---+------+----+
| id|  name| age|
+---+------+----+
|100|  John|  30|
|200|  Mary|null|
|300|  Mike|  80|
|500|Evan_W|  16|
+---+------+----+
SELECT * FROM person WHERE name NOT LIKE SOME ('%an%', '%an');
+---+------+----+
| id|  name| age|
+---+------+----+
|100|  John|  30|
|200|  Mary|null|
|300|  Mike|  80|
|500|Evan_W|  16|
+---+------+----+
```

#### OFFSET
<a name="supported-sql-offset"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `OFFSET` clause est utilisée pour spécifier le nombre de lignes à ignorer avant de commencer à renvoyer les lignes renvoyées par l'`SELECT`instruction. En général, cette clause est utilisée conjointement `ORDER BY` pour garantir que les résultats sont déterministes. 

**Syntaxe** 

```
OFFSET integer_expression
```

**Paramètres**
+ **expression\$1entière**

  Spécifie une expression pliable qui renvoie un entier. 

**Exemples**

```
CREATE TABLE person (name STRING, age INT);
INSERT INTO person VALUES
('Jane Doe', 25),
('Pat C', 18),
('Nikki W', 16),
('Juan L', 25),
('John D', 18),
('Jorge S', 16);

-- Skip the first two rows.
SELECT name, age FROM person ORDER BY name OFFSET 2;
+-------+---+
|   name|age|
+-------+---+
| John D| 18|
| Juan L| 25|
|Nikki W| 16|
|Jane Doe| 25|
+-------+---+

-- Skip the first two rows and returns the next three rows.
SELECT name, age FROM person ORDER BY name LIMIT 3 OFFSET 2;
+-------+---+
|   name|age|
+-------+---+
| John D| 18|
| Juan L| 25|
|Nikki W| 16|
+-------+---+

-- A function expression as an input to OFFSET.
SELECT name, age FROM person ORDER BY name OFFSET length('WAGON');
+-------+---+
|   name|age|
+-------+---+
|Jane Doe| 25|
+-------+---+
```

#### Clause PIVOT
<a name="supported-sql-pivot"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `PIVOT` clause est utilisée pour la perspective des données. Nous pouvons obtenir les valeurs agrégées en fonction de valeurs de colonne spécifiques, qui seront transformées en plusieurs colonnes utilisées dans la `SELECT` clause. La `PIVOT` clause peut être spécifiée après le nom de la table ou la sous-requête. 

**Syntaxe** 

```
PIVOT ( { aggregate_expression [ AS aggregate_expression_alias ] } [ , ... ] FOR column_list IN ( expression_list ) ) 
```

**Paramètres** 
+ **aggregate\$1expression**

  Spécifie une expression agrégée `(SUM(a)``COUNT(DISTINCT b)`, etc.). 
+ **alias d'expression\$1agrégé**

  Spécifie un alias pour l'expression agrégée. 
+ **column\$1list**

  Contient des colonnes dans la `FROM` clause, qui spécifie les colonnes que vous souhaitez remplacer par de nouvelles colonnes. Vous pouvez utiliser des crochets pour entourer les colonnes, par exemple`(c1, c2)`. 
+ **expression\$1list**

  Spécifie les nouvelles colonnes, qui sont utilisées pour faire correspondre les valeurs en `column_list` tant que condition d'agrégation. Vous pouvez également leur ajouter des alias. 

**Exemples**

```
CREATE TABLE person (id INT, name STRING, age INT, class INT, address STRING);
INSERT INTO person VALUES
(100, 'John', 30, 1, 'Street 1'),
(200, 'Mary', NULL, 1, 'Street 2'),
(300, 'Mike', 80, 3, 'Street 3'),
(400, 'Dan', 50, 4, 'Street 4');
SELECT * FROM person
PIVOT (
SUM(age) AS a, AVG(class) AS c
FOR name IN ('John' AS john, 'Mike' AS mike)
);
+------+-----------+---------+---------+---------+---------+
|  id  |  address  | john_a  | john_c  | mike_a  | mike_c  |
+------+-----------+---------+---------+---------+---------+
| 200  | Street 2  | NULL    | NULL    | NULL    | NULL    |
| 100  | Street 1  | 30      | 1.0     | NULL    | NULL    |
| 300  | Street 3  | NULL    | NULL    | 80      | 3.0     |
| 400  | Street 4  | NULL    | NULL    | NULL    | NULL    |
+------+-----------+---------+---------+---------+---------+
SELECT * FROM person
PIVOT (
SUM(age) AS a, AVG(class) AS c
FOR (name, age) IN (('John', 30) AS c1, ('Mike', 40) AS c2)
);
+------+-----------+-------+-------+-------+-------+
|  id  |  address  | c1_a  | c1_c  | c2_a  | c2_c  |
+------+-----------+-------+-------+-------+-------+
| 200  | Street 2  | NULL  | NULL  | NULL  | NULL  |
| 100  | Street 1  | 30    | 1.0   | NULL  | NULL  |
| 300  | Street 3  | NULL  | NULL  | NULL  | NULL  |
| 400  | Street 4  | NULL  | NULL  | NULL  | NULL  |
+------+-----------+-------+-------+-------+-------+
```

#### Définir les opérateurs
<a name="supported-sql-set"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

Les opérateurs d'ensemble sont utilisés pour combiner deux relations d'entrée en une seule. OpenSearch SQL prend en charge trois types d'opérateurs d'ensemble : 
+ `EXCEPT` ou `MINUS`
+ `INTERSECT` 
+ `UNION` 

Les relations d'entrée doivent comporter le même nombre de colonnes et les mêmes types de données compatibles pour les colonnes respectives. 

**SAUF** 

`EXCEPT`et `EXCEPT ALL` renvoie les lignes trouvées dans une relation mais pas dans l'autre. `EXCEPT`(également,`EXCEPT DISTINCT`) ne prend que des lignes distinctes `EXCEPT ALL` sans supprimer les doublons des lignes de résultats. Notez qu'il `MINUS` s'agit d'un alias pour`EXCEPT`. 

**Syntaxe** 

```
 [ ( ] relation [ ) ] EXCEPT | MINUS [ ALL | DISTINCT ] [ ( ] relation [ ) ] 
```

**Exemples**

```
-- Use table1 and table2 tables to demonstrate set operators in this page.
SELECT * FROM table1;
+---+
|  c|
+---+
|  3|
|  1|
|  2|
|  2|
|  3|
|  4|
+---+
SELECT * FROM table2;
+---+
|  c|
+---+
|  5|
|  1|
|  2|
|  2|
+---+
SELECT c FROM table1 EXCEPT SELECT c FROM table2;
+---+
|  c|
+---+
|  3|
|  4|
+---+
SELECT c FROM table1 MINUS SELECT c FROM table2;
+---+
|  c|
+---+
|  3|
|  4|
+---+
SELECT c FROM table1 EXCEPT ALL (SELECT c FROM table2);
+---+
|  c|
+---+
|  3|
|  3|
|  4|
+---+
SELECT c FROM table1 MINUS ALL (SELECT c FROM table2);
+---+
|  c|
+---+
|  3|
|  3|
|  4|
+---+
```

**SE CROISER** 

`INTERSECT`et `INTERSECT ALL` renvoient les lignes présentes dans les deux relations. `INTERSECT`(également,`INTERSECT DISTINCT`) ne prend que des lignes distinctes `INTERSECT ALL` sans supprimer les doublons des lignes de résultats.

**Syntaxe** 

```
 [ ( ] relation [ ) ] INTERSECT [ ALL | DISTINCT ] [ ( ] relation [ ) ]
```

**Exemples**

```
(SELECT c FROM table1) INTERSECT (SELECT c FROM table2);
+---+
|  c|
+---+
|  1|
|  2|
+---+
(SELECT c FROM table1) INTERSECT DISTINCT (SELECT c FROM table2);
+---+
|  c|
+---+
|  1|
|  2|
+---+
(SELECT c FROM table1) INTERSECT ALL (SELECT c FROM table2);
+---+
|  c|
+---+
|  1|
|  2|
|  2|
+---+
```

**SYNDICAT** 

`UNION`et `UNION ALL` renvoient les lignes trouvées dans l'une ou l'autre relation. `UNION`(également,`UNION DISTINCT`) ne prend que des lignes distinctes `UNION ALL` sans supprimer les doublons des lignes de résultats.

**Syntaxe** 

```
 [ ( ] relation [ ) ] UNION [ ALL | DISTINCT ] [ ( ] relation [ ) ]
```

**Exemples**

```
(SELECT c FROM table1) UNION (SELECT c FROM table2);
+---+
|  c|
+---+
|  1|
|  3|
|  5|
|  4|
|  2|
+---+
(SELECT c FROM table1) UNION DISTINCT (SELECT c FROM table2);
+---+
|  c|
+---+
|  1|
|  3|
|  5|
|  4|
|  2|
+---+
SELECT c FROM table1 UNION ALL (SELECT c FROM table2);
+---+
|  c|
+---+
|  3|
|  1|
|  2|
|  2|
|  3|
|  4|
|  5|
|  1|
|  2|
|  2|
+---+
```

#### Clause TRIER PAR
<a name="supported-sql-sort-by"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `SORT BY` clause est utilisée pour renvoyer les lignes de résultats triées dans chaque partition dans l'ordre spécifié par l'utilisateur. Lorsqu'il y a plus d'une partition, le résultat `SORT BY` peut être partiellement ordonné. Ceci est différent de la `ORDER BY` clause qui garantit un ordre total de la sortie. 

**Syntaxe** 

```
SORT BY { expression [ sort_direction | nulls_sort_order ] [ , ... ] }
```

**Paramètres**
+ **TRIER PAR**

  Spécifie une liste d'expressions séparées par des virgules ainsi que les paramètres facultatifs sort\$1direction et nulls\$1sort\$1order qui sont utilisés pour trier les lignes au sein de chaque partition. 
+ **direction\$1tri**

  Spécifie éventuellement s'il faut trier les lignes par ordre croissant ou décroissant. 

  Les valeurs valides pour le sens de tri sont `ASC` pour le sens ascendant et `DESC` pour le sens descendant. 

  Si le sens de tri n'est pas explicitement spécifié, les lignes sont triées par défaut dans l'ordre croissant. 

  Syntaxe : `[ ASC | DESC ]` 
+ **nulls\$1sort\$1order**

  Spécifie éventuellement si les valeurs NULL sont renvoyées avant/après les valeurs non NULL. 

  Si `null_sort_order` ce n'est pas spécifié, NULLs triez d'abord si l'ordre de tri est le cas `ASC` et NULLS trie en dernier si c'est `DESC` le cas. 

  1. Si elle `NULLS FIRST` est spécifiée, les valeurs NULL sont renvoyées en premier, quel que soit l'ordre de tri. 

  2. Si elle `NULLS LAST` est spécifiée, les valeurs NULL sont renvoyées en dernier, quel que soit l'ordre de tri. 

  Syntaxe : `[ NULLS { FIRST | LAST } ] `

**Exemples**

```
CREATE TABLE person (zip_code INT, name STRING, age INT);
INSERT INTO person VALUES
(94588, 'Shirley Rodriguez', 50),
(94588, 'Juan Li', 18),
(94588, 'Anil K', 27),
(94588, 'John D', NULL),
(94511, 'David K', 42),
(94511, 'Aryan B.', 18),
(94511, 'Lalit B.', NULL);
-- Sort rows by `name` within each partition in ascending manner
SELECT name, age, zip_code FROM person SORT BY name;
+------------------+----+--------+
|              name| age|zip_code|
+------------------+----+--------+
|            Anil K|  27|   94588|
|           Juan Li|  18|   94588|
|            John D|null|   94588|
| Shirley Rodriguez|  50|   94588|
|          Aryan B.|  18|   94511|
|           David K|  42|   94511|
|          Lalit B.|null|   94511|
+------------------+----+--------+
-- Sort rows within each partition using column position.
SELECT name, age, zip_code FROM person SORT BY 1;
+----------------+----+----------+
|              name| age|zip_code|
+------------------+----+--------+
|            Anil K|  27|   94588|
|           Juan Li|  18|   94588|
|            John D|null|   94588|
| Shirley Rodriguez|  50|   94588|
|          Aryan B.|  18|   94511|
|           David K|  42|   94511|
|          Lalit B.|null|   94511|
+------------------+----+--------+

-- Sort rows within partition in ascending manner keeping null values to be last.
SELECT age, name, zip_code FROM person SORT BY age NULLS LAST;
+----+------------------+--------+
| age|              name|zip_code|
+----+------------------+--------+
|  18|           Juan Li|   94588|
|  27|            Anil K|   94588|
|  50| Shirley Rodriguez|   94588|
|null|            John D|   94588|
|  18|          Aryan B.|   94511|
|  42|           David K|   94511|
|null|          Lalit B.|   94511|
+--------------+--------+--------+

-- Sort rows by age within each partition in descending manner, which defaults to NULL LAST.
SELECT age, name, zip_code FROM person SORT BY age DESC;
+----+------------------+--------+
| age|              name|zip_code|
+----+------------------+--------+
|  50|          Shirley Rodriguez|   94588|
|  27|            Anil K|   94588|
|  18|           Juan Li|   94588|
|null|            John D|   94588|
|  42|           David K|   94511|
|  18|          Aryan B.|   94511|
|null|          Lalit B.|   94511|
+----+------------------+--------+

-- Sort rows by age within each partition in descending manner keeping null values to be first.
SELECT age, name, zip_code FROM person SORT BY age DESC NULLS FIRST;
+----+------------------+--------+
| age|              name|zip_code|
+----+------------------+--------+
|null|            John D|   94588|
|  50| Shirley Rodriguez|   94588|
|  27|            Anil K|   94588|
|  18|           Juan Li|   94588|
|null|          Lalit B.|   94511|
|  42|           David K|   94511|
|  18|          Aryan B.|   94511|
+--------------+--------+--------+

-- Sort rows within each partition based on more than one column with each column having
-- different sort direction.
SELECT name, age, zip_code FROM person
SORT BY name ASC, age DESC;
+------------------+----+--------+
|              name| age|zip_code|
+------------------+----+--------+
|            Anil K|  27|   94588|
|           Juan Li|  18|   94588|
|            John D|null|   94588|
| Shirley Rodriguez|  50|   94588|
|          Aryan B.|  18|   94511|
|           David K|  42|   94511|
|          Lalit B.|null|   94511|
+------------------+----+--------+
```

#### UNPIVOT
<a name="supported-sql-unpivot"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande SQL, consultez[Commandes et fonctions OpenSearch SQL prises en charge](#supported-directquery-sql).

La `UNPIVOT` clause transforme plusieurs colonnes en plusieurs lignes utilisées dans la `SELECT` clause. La `UNPIVOT` clause peut être spécifiée après le nom de la table ou la sous-requête. 

**Syntaxe** 

```
UNPIVOT [ { INCLUDE | EXCLUDE } NULLS ] (
    { single_value_column_unpivot | multi_value_column_unpivot }
) [[AS] alias]

single_value_column_unpivot:
    values_column
    FOR name_column
    IN (unpivot_column [[AS] alias] [, ...])

multi_value_column_unpivot:
    (values_column [, ...])
    FOR name_column
    IN ((unpivot_column [, ...]) [[AS] alias] [, ...])
```

**Paramètres**
+ **unpivot\$1column**

  Contient des colonnes dans la `FROM` clause, qui spécifie les colonnes que nous voulons défaire pivoter. 
+ **nom\$1colonne**

  Nom de la colonne qui contient les noms des colonnes non pivotées. 
+ **colonne\$1valeurs**

  Nom de la colonne contenant les valeurs des colonnes non pivotées. 

**Exemples**

```
CREATE TABLE sales_quarterly (year INT, q1 INT, q2 INT, q3 INT, q4 INT);
INSERT INTO sales_quarterly VALUES
(2020, null, 1000, 2000, 2500),
(2021, 2250, 3200, 4200, 5900),
(2022, 4200, 3100, null, null);
-- column names are used as unpivot columns
SELECT * FROM sales_quarterly
UNPIVOT (
sales FOR quarter IN (q1, q2, q3, q4)
);
+------+---------+-------+
| year | quarter | sales |
+------+---------+-------+
| 2020 | q2      | 1000  |
| 2020 | q3      | 2000  |
| 2020 | q4      | 2500  |
| 2021 | q1      | 2250  |
| 2021 | q2      | 3200  |
| 2021 | q3      | 4200  |
| 2021 | q4      | 5900  |
| 2022 | q1      | 4200  |
| 2022 | q2      | 3100  |
+------+---------+-------+
-- NULL values are excluded by default, they can be included
-- unpivot columns can be alias
-- unpivot result can be referenced via its alias
SELECT up.* FROM sales_quarterly
UNPIVOT INCLUDE NULLS (
sales FOR quarter IN (q1 AS Q1, q2 AS Q2, q3 AS Q3, q4 AS Q4)
) AS up;
+------+---------+-------+
| year | quarter | sales |
+------+---------+-------+
| 2020 | Q1      | NULL  |
| 2020 | Q2      | 1000  |
| 2020 | Q3      | 2000  |
| 2020 | Q4      | 2500  |
| 2021 | Q1      | 2250  |
| 2021 | Q2      | 3200  |
| 2021 | Q3      | 4200  |
| 2021 | Q4      | 5900  |
| 2022 | Q1      | 4200  |
| 2022 | Q2      | 3100  |
| 2022 | Q3      | NULL  |
| 2022 | Q4      | NULL  |
+------+---------+-------+
-- multiple value columns can be unpivoted per row
SELECT * FROM sales_quarterly
UNPIVOT EXCLUDE NULLS (
(first_quarter, second_quarter)
FOR half_of_the_year IN (
(q1, q2) AS H1,
(q3, q4) AS H2
)
);
+------+------------------+---------------+----------------+
|  id  | half_of_the_year | first_quarter | second_quarter |
+------+------------------+---------------+----------------+
| 2020 | H1               | NULL          | 1000           |
| 2020 | H2               | 2000          | 2500           |
| 2021 | H1               | 2250          | 3200           |
| 2021 | H2               | 4200          | 5900           |
| 2022 | H1               | 4200          | 3100           |
+------+------------------+---------------+----------------+
```

# Commandes PPL prises en charge
<a name="supported-ppl"></a>

Les tableaux suivants indiquent les commandes PPL prises en charge par OpenSearch Dashboards pour interroger CloudWatch Logs, Amazon S3 ou Security Lake, ainsi que les commandes prises en charge par CloudWatch Logs Insights. CloudWatch Logs Insights utilise la même syntaxe PPL que les OpenSearch tableaux de bord lorsqu'il interroge les CloudWatch journaux, et les tables désignent les deux par le terme « journaux ». CloudWatch 

**Note**  
Lorsque vous analysez des données en dehors de OpenSearch Service, les commandes peuvent s'exécuter différemment de celles OpenSearch des index.

**Topics**
+ [Commandes](#supported-ppl-commands)
+ [Fonctions](#supported-ppl-functions)
+ [Informations supplémentaires pour les utilisateurs de CloudWatch Logs Insights utilisant OpenSearch PPL](#supported-ppl-for-cloudwatch-users)

## Commandes
<a name="supported-ppl-commands"></a>


| commande PPL | Description | CloudWatch Journaux | Amazon S3 | Security Lake | Exemple de commande  | 
| --- | --- | --- | --- | --- | --- | 
| [commande fields](#supported-ppl-fields-command) | Affiche un ensemble de champs devant être projetés. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> fields field1, field2</pre>  | 
| [où commande](#supported-ppl-where-command) |  Filtre les données en fonction des conditions que vous spécifiez.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> where field1="success"<br />| where field2 != "i -023fe0a90929d8822"<br />| fields field3, col4, col5, col6<br />| head 1000</pre>  | 
| [commande stats](#supported-ppl-stats-command) |  Effectue des agrégations et des calculs.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>stats count(),<br />      count(`field1`),<br />      min(`field1`),<br />      max(`field1`),<br />      avg(`field1`)<br />by field2<br />| head 1000</pre>  | 
| [commande d'analyse](#supported-ppl-parse-command) |  Extrait un modèle d'expression régulière (regex) d'une chaîne et affiche le modèle extrait. Le modèle extrait peut également être utilisé pour créer de nouveaux champs ou filtrer des données.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>parse `field1` ".*/(?<field2>[^/]+$)"<br />| where field2 = "requestId"<br />| fields field2, `field2`<br />| head 1000</pre>  | 
| [commande patterns](#supported-ppl-patterns-command) |  Extrait les modèles de journal d'un champ de texte et ajoute les résultats aux résultats de recherche. Le regroupement des journaux en fonction de leurs modèles facilite l'agrégation des statistiques provenant de gros volumes de données de journaux à des fins d'analyse et de résolution des problèmes.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>patterns new_field='no_numbers' pattern='[0-9]' message<br />| fields message, no_numbers</pre>  | 
| [commande de tri](#supported-ppl-sort-command) |  Triez les résultats affichés par nom de champ. Utilisez le **tri - *FieldName***pour trier par ordre décroissant.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>stats count(),<br />      count(`field1`),<br />      min(`field1`) as field1Alias,<br />      max(`field1`),<br />      avg(`field1`)<br />by field2<br />| sort -field1Alias<br />| head 1000</pre>  | 
| [commande eval](#supported-ppl-eval-command) |  Modifie ou traite la valeur d'un champ et la stocke dans un autre champ. Cela est utile pour modifier mathématiquement une colonne, appliquer des fonctions de chaîne à une colonne ou appliquer des fonctions de date à une colonne.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>eval field2 = `field1` * 2<br />| fields field1, field2<br />| head 20</pre>  | 
| [renommer la commande](#supported-ppl-rename-command) |  Renomme un ou plusieurs champs dans les résultats de recherche.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>rename field2 as field1<br />| fields field1</pre>  | 
| [commande principale](#supported-ppl-head-command) |  Limite les résultats de requête affichés aux N premières lignes.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> fields `@message`<br />| head 20</pre>  | 
| [commande grok](#supported-ppl-grok-command) |  Analyse un champ de texte avec un modèle grok basé sur une expression régulière et ajoute les résultats aux résultats de recherche.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> grok email '.+@%{HOSTNAME:host}'<br />| fields email</pre>  | 
| [commande supérieure](#supported-ppl-top-command) |  Recherche les valeurs les plus fréquentes pour un champ.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> top 2 Field1 by Field2</pre>  | 
| [commande dedup](#supported-ppl-dedup-command) |  Supprime les entrées dupliquées en fonction des champs que vous spécifiez.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>dedup field1<br />| fields field1, field2, field3</pre>  | 
| [commande join](#supported-ppl-join-commands) |  Joint deux ensembles de données.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>source=customer<br />| join ON c_custkey = o_custkey orders<br />| head 10</pre>  | 
| [commande de recherche](#supported-ppl-lookup-commands) |  Enrichit vos données de recherche en ajoutant ou en remplaçant les données d'un index de recherche (table de dimensions). Vous pouvez étendre les champs d'un index avec des valeurs issues d'une table de dimensions, ajouter ou remplacer des valeurs lorsque la condition de recherche correspond  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>where orderType = 'Cancelled'<br />| lookup account_list, mkt_id AS mkt_code<br />  replace amount, account_name as name<br />| stats count(mkt_code), avg(amount)<br />  by name</pre>  | 
| [commande de sous-requête](#supported-ppl-subquery-commands) | Exécute des requêtes complexes et imbriquées dans vos instructions PPL (Piped Processing Language). | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>where id in [<br />  subquery source=users<br />  | where user in [<br />    subquery source=actions<br />    | where action="login"<br />    | fields user<br />  ]<br />  | fields uid<br />]</pre>  | 
| [commande rare](#supported-ppl-rare-command) |  Recherche les valeurs les moins fréquentes de tous les champs de la liste de champs.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> rare Field1 by Field2</pre>  | 
| [commande trendline](#supported-ppl-trendline-commands) | Calcule les moyennes mobiles des champs. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> trendline sma(2, field1) as field1Alias</pre>  | 
| [commande eventstats](#supported-ppl-eventstats-command) | Enrichissez les données de vos événements grâce à des statistiques récapitulatives calculées. Il analyse les champs spécifiés au sein de vos événements, calcule diverses mesures statistiques, puis ajoute ces résultats à chaque événement d'origine sous forme de nouveaux champs. |  ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Supporté (sauf`count()`)  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> eventstats sum(field1) by field2</pre>  | 
| [commande aplatir](#supported-ppl-flatten-command) |  Aplatit un champ. Le champ doit être de ce type : `struct<?,?> or array<struct<?,?>>`  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> source=table | flatten field1</pre>  | 
| [résumé du champ](#supported-ppl-field-summary-command) | Calcule les statistiques de base pour chaque champ (nombre, nombre distinct, min, max, avg, stddev et moyenne). | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Supporté (un champ par requête) | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>where field1 != 200<br />| fieldsummary includefields=field1 nulls=true</pre>  | 
| [commande fillnull](#supported-ppl-fillnull-command) | Remplit les champs nuls avec la valeur que vous fournissez. Il peut être utilisé dans un ou plusieurs domaines. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>fields field1<br />| eval field2=field1<br />| fillnull value=0 field1</pre>  | 
| [commande d'extension](#supported-ppl-expand-command) | Décompose un champ contenant plusieurs valeurs en lignes distinctes, en créant une nouvelle ligne pour chaque valeur du champ spécifié. | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>expand employee<br />| stats max(salary) as max<br />  by state, company</pre>  | 
| [décrire la commande](#supported-ppl-describe-command) |  Obtient des informations détaillées sur la structure et les métadonnées des tables, des schémas et des catalogues  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre> describe schema.table</pre>  | 

## Fonctions
<a name="supported-ppl-functions"></a>


| Fonction PPL | Description | CloudWatch Journaux | Amazon S3 | Security Lake | Exemple de commande  | 
| --- | --- | --- | --- | --- | --- | 
|  [Fonctions de chaîne PPL](#supported-ppl-string-functions) (`CONCAT`, `CONCAT_WS`, `LENGTH`, `LOWER`, `LTRIM`, `POSITION`, `REVERSE`, `RIGHT`, `RTRIM`, `SUBSTRING`, `TRIM`, `UPPER`)  |  Fonctions intégrées dans PPL qui peuvent manipuler et transformer des chaînes et des données de texte dans les requêtes PPL. Par exemple, convertir des majuscules, combiner des chaînes, extraire des parties et nettoyer du texte.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>eval col1Len = LENGTH(col1)<br />| fields col1Len</pre>  | 
|  [Fonctions de date et d'heure PPL](#supported-ppl-date-time-functions) (`DAY`, `DAYOFMONTH`, `DAY_OF_MONTH`,`DAYOFWEEK`, `DAY_OF_WEEK`, `DAYOFYEAR`, `DAY_OF_YEAR`, `DAYNAME`, `FROM_UNIXTIME`, `HOUR`, `HOUR_OF_DAY`, `LAST_DAY`, `LOCALTIMESTAMP`, `LOCALTIME`, `MAKE_DATE`, `MINUTE`, `MINUTE_OF_HOUR`, `MONTH`, `MONTHNAME`, `MONTH_OF_YEAR`, `NOW`, `QUARTER`, `SECOND`, `SECOND_OF_MINUTE`, `SUBDATE`, `SYSDATE`, `TIMESTAMP`, `UNIX_TIMESTAMP`, `WEEK`, `WEEKDAY`, `WEEK_OF_YEAR`, `DATE_ADD`, `DATE_SUB`, `TIMESTAMPADD`, `TIMESTAMPDIFF`, `UTC_TIMESTAMP`, `CURRENT_TIMEZONE`)  |  Fonctions intégrées pour gérer et transformer les données de date et d'horodatage dans les requêtes PPL. **Par exemple, **date\$1add, date\$1format****, datediff et **current\$1date****.**  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>eval newDate = ADDDATE(DATE('2020-08-26'), 1)<br />| fields newDate</pre>  | 
|  [Fonctions de condition PPL](#supported-ppl-condition-functions) (`EXISTS`, `IF`, `IFNULL`, `ISNOTNULL`, `ISNULL`, `NULLIF`)  |  Fonctions intégrées qui effectuent des calculs sur plusieurs lignes pour produire une seule valeur résumée. Par exemple, **sum**, **count**, **avg**, **max** et **min.**  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>eval field2 = isnull(col1)<br />| fields field2, col1, field3  </pre>  | 
|  [Fonctions mathématiques PPL](#supported-ppl-math-functions) (`ABS`, `ACOS`, `ASIN`, `ATAN`, `ATAN2`, `CEIL`, `CEILING`, `CONV`, `COS`, `COT`, `CRC32`, `DEGREES`, `E`, `EXP`, `FLOOR`, `LN`, `LOG`, `LOG2`, `LOG10`, `MOD`, `PI`. `POW`, `POWER`, `RADIANS`, `RAND`, `ROUND`, `SIGN`, `SIN`, `SQRT`, `CBRT`)  |  Fonctions intégrées pour effectuer des calculs mathématiques et des transformations dans les requêtes PPL. Par exemple : **abs** (valeur absolue), **round (arrondit** les nombres), **sqrt** (racine carrée), **pow** (calcul de puissance) et **ceil** (arrondit au nombre entier le plus proche).  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>eval field2 = ACOS(col1)<br />| fields col1</pre>  | 
|  [Expressions PPL](#supported-ppl-expressions) (Opérateurs arithmétiques (`+`,,`*`)`-`, Opérateurs de prédicat (`>. <`,) `IN)`  |  Les fonctions intégrées pour les expressions, en particulier les expressions de valeur, renvoient une valeur scalaire. Les expressions ont différents types et formes.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>where age > (25 + 5)<br />| fields age  </pre>  | 
|  [Fonctions d'adresse IP PPL](#supported-ppl-ip-address-functions) (`CIDRMATCH`)  |  Fonctions intégrées pour gérer les adresses IP telles que le CIDR.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>where cidrmatch(ip, '***********/24')<br />| fields ip </pre>  | 
|  [Fonctions JSON PPL](#supported-ppl-json-functions) (`ARRAY_LENGTH`, `ARRAY_LENGTH`, `JSON`, `JSON_ARRAY`, `JSON_EXTRACT`, `JSON_KEYS`, `JSON_OBJECT`, `JSON_VALID`, `TO_JSON_STRING`)  |  Fonctions intégrées pour gérer le JSON, notamment les tableaux, l'extraction et la validation.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>eval `json_extract('{"a":"b"}', '$.a')` = json_extract('{"a":"b"}', '$a')</pre>  | 
|  [Fonctions Lambda PPL](#supported-ppl-lambda-functions) (`EXISTS`, `FILTER`, `REDUCE`, `TRANSFORM`)  |  Fonctions intégrées pour gérer le JSON, notamment les tableaux, l'extraction et la validation.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/negative_icon.svg)Non pris en charge | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>eval array = json_array(1, -1, 2),<br />     result = filter(array, x -> x > 0)<br />| fields result</pre>  | 
|  [Fonctions de hachage cryptographiques PPL](#supported-ppl-cryptographic-functions) (`MD5`, `SHA1`, `SHA2`)  |  Des fonctions intégrées vous permettent de générer des empreintes digitales uniques de données, qui peuvent être utilisées à des fins de vérification, de comparaison ou dans le cadre de protocoles de sécurité plus complexes.  | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu | ![\[alt text not found\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/success_icon.svg)Soutenu |  <pre>eval `MD5('hello')` = MD5('hello')<br />| fields `MD5('hello')`</pre>  | 

## Informations supplémentaires pour les utilisateurs de CloudWatch Logs Insights utilisant OpenSearch PPL
<a name="supported-ppl-for-cloudwatch-users"></a>

Bien que CloudWatch Logs Insights prenne en charge la plupart des commandes et fonctions OpenSearch PPL, certaines commandes et fonctions ne sont pas prises en charge actuellement. Par exemple, il ne prend actuellement pas en charge les commandes Lookup dans PPL. Depuis le 2 juin 2025, CloudWatch Logs Insights prend désormais en charge les fonctions JOIN, subqueries, Flatten, Fillnull, Expand, Cidrmatch et JSON dans PPL. Pour obtenir la liste complète des commandes et fonctions de requête prises en charge, consultez les colonnes Amazon CloudWatch Logs dans les tableaux ci-dessus.

### Exemples de requêtes et de quotas
<a name="sample-queries"></a>

Ce qui suit s'applique à la fois aux utilisateurs de CloudWatch Logs Insights et OpenSearch aux utilisateurs interrogeant CloudWatch des données.

Pour plus d'informations sur les limites applicables lors de l'interrogation de CloudWatch Logs from OpenSearch Service, consultez la section [Quotas de CloudWatch journaux](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html) dans le guide de l'utilisateur Amazon CloudWatch Logs. Les limites concernent le nombre de groupes de CloudWatch journaux que vous pouvez interroger, le nombre maximal de requêtes simultanées que vous pouvez exécuter, le temps d'exécution maximal des requêtes et le nombre maximum de lignes renvoyées dans les résultats. Les limites sont les mêmes quel que soit le langage que vous utilisez pour interroger CloudWatch les journaux (à savoir, OpenSearch PPL, SQL et Logs Insights QL). 

### Commandes PPL
<a name="supported-ppl-commands-details"></a>

**Topics**
+ [comment](#supported-ppl-comment)
+ [commande de corrélation](#supported-ppl-correlation-commands)
+ [commande dedup](#supported-ppl-dedup-command)
+ [décrire la commande](#supported-ppl-describe-command)
+ [commande eval](#supported-ppl-eval-command)
+ [commande eventstats](#supported-ppl-eventstats-command)
+ [commande d'extension](#supported-ppl-expand-commands)
+ [expliquer la commande](#supported-ppl-explain-command)
+ [commande fillnull](#supported-ppl-fillnull-command)
+ [commande fields](#supported-ppl-fields-command)
+ [commande aplatir](#supported-ppl-flatten-command)
+ [commande grok](#supported-ppl-grok-command)
+ [commande principale](#supported-ppl-head-command)
+ [commande join](#supported-ppl-join-commands)
+ [commande de recherche](#supported-ppl-lookup-commands)
+ [commande d'analyse](#supported-ppl-parse-command)
+ [commande patterns](#supported-ppl-patterns-command)
+ [commande rare](#supported-ppl-rare-command)
+ [renommer la commande](#supported-ppl-rename-command)
+ [commande de recherche](#supported-ppl-search-command)
+ [commande de tri](#supported-ppl-sort-command)
+ [commande stats](#supported-ppl-stats-command)
+ [commande de sous-requête](#supported-ppl-subquery-commands)
+ [commande supérieure](#supported-ppl-top-command)
+ [commande trendline](#supported-ppl-trendline-commands)
+ [où commande](#supported-ppl-where-command)
+ [résumé du champ](#supported-ppl-field-summary-command)
+ [commande d'extension](#supported-ppl-expand-command)
+ [Fonctions PPL](#supported-ppl-functions-details)

#### comment
<a name="supported-ppl-comment"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

PPL prend en charge à la fois les commentaires de ligne et les commentaires de bloc. Le système n'évalue pas le texte des commentaires.

**Commentaires sur les lignes**  
Les commentaires de ligne commencent par deux barres obliques//et se terminent par une nouvelle ligne. 

Exemple : 

```
os> source=accounts | top gender // finds most common gender of all the accounts
fetched rows / total rows = 2/2
+----------+
| gender   |
|----------|
| M        |
| F        |
+----------+
```

**Bloquer les commentaires**  
Les commentaires en bloc commencent par une barre oblique suivie d'un astérisque \$1 \$1 et se terminent par un astérisque suivi d'une barre oblique \$1/. 

Exemple :

```
os> source=accounts | dedup 2 gender /* dedup the document with gender field keep 2 duplication */ | fields account_number, gender
fetched rows / total rows = 3/3
+------------------+----------+
| account_number   | gender   |
|------------------+----------|
| 1                | M        |
| 6                | M        |
| 13               | F        |
+------------------+----------+
```

#### commande de corrélation
<a name="supported-ppl-correlation-commands"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Vous pouvez corréler différentes sources de données selon des dimensions et des délais communs. 

Cette corrélation est cruciale lorsque vous traitez de grandes quantités de données provenant de différents secteurs verticaux qui partagent les mêmes périodes mais ne sont pas officiellement synchronisées.

En corrélant ces différentes sources de données en fonction de délais et de dimensions similaires, vous pouvez enrichir vos données et découvrir des informations précieuses.

**Exemple**  
Le domaine de l'observabilité comporte trois sources de données distinctes :
+ Journaux
+ Métriques
+ Suivis

Ces sources de données peuvent avoir des dimensions communes. Pour passer d'une source de données à une autre, vous devez les corréler correctement. À l'aide de conventions de dénomination sémantiques, vous pouvez identifier les éléments partagés dans les journaux, les traces et les métriques.

Exemple :

```
{
  "@timestamp": "2018-07-02T22:23:00.186Z",
  "aws": {
    "elb": {
      "backend": {
        "http": {
          "response": {
            "status_code": 500
          }
        },
        "ip": "********",
        "port": "80"
      },
      ...
     "target_port": [
        "10.0.0.1:80"
      ],
      "target_status_code": [
        "500"
      ],
      "traceId": "Root=1-58337262-36d228ad5d99923122bbe354",
      "type": "http"
    }
  },
  "cloud": {
    "provider": "aws"
  },
  "http": {
    "request": {
    ...
  },
  "communication": {
    "source": {
      "address": "**************",
      "ip": "**************",
      "port": 2817
    }
  },
  "traceId": "Root=1-58337262-36d228ad5d99923122bbe354"
}
```

Cet exemple montre un journal AWS ELB provenant d'un service résidant sur AWS. Il affiche une réponse HTTP du backend avec un code d'état de 500, indiquant une erreur. Cela peut déclencher une alerte ou faire partie de votre processus de surveillance habituel. La prochaine étape consiste à recueillir des données pertinentes sur cet événement afin de mener une enquête approfondie.

Bien que vous soyez tenté d'interroger toutes les données relatives à la période, cette approche peut être accablante. Vous pourriez vous retrouver avec trop d'informations et passer plus de temps à filtrer les données non pertinentes qu'à en identifier la cause première. 

Vous pouvez plutôt utiliser une approche plus ciblée en corrélant les données provenant de différentes sources. Vous pouvez utiliser les dimensions suivantes à des fins de corrélation :
+ **Adresse IP** - `"ip": "10.0.0.1" | "ip": "**************"`
+ **Port** - `"port": 2817 | "target_port": "10.0.0.1:80"`

En supposant que vous avez accès à des traces et à des indices de mesures supplémentaires et que vous connaissez la structure de votre schéma, vous pouvez créer une requête de corrélation plus précise.

Voici un exemple de document d'index de trace contenant des informations HTTP que vous souhaiterez peut-être corréler :

```
{
  "traceId": "c1d985bd02e1dbb85b444011f19a1ecc",
  "spanId": "55a698828fe06a42",
  "traceState": [],
  "parentSpanId": "",
  "name": "mysql",
  "kind": "CLIENT",
  "@timestamp": "2021-11-13T20:20:39+00:00",
  "events": [
    {
      "@timestamp": "2021-03-25T17:21:03+00:00",
       ...
    }
  ],
  "links": [
    {
      "traceId": "c1d985bd02e1dbb85b444011f19a1ecc",
      "spanId": "55a698828fe06a42w2",
      },
      "droppedAttributesCount": 0
    }
  ],
  "resource": {
    "service@name": "database",
    "telemetry@sdk@name": "opentelemetry",
    "host@hostname": "ip-172-31-10-8.us-west-2.compute.internal"
  },
  "status": {
    ...
  },
  "attributes": {
    "http": {
      "user_agent": {
        "original": "Mozilla/5.0"
      },
      "network": {
         ...
        }
      },
      "request": {
         ...
        }
      },
      "response": {
        "status_code": "200",
        "body": {
          "size": 500
        }
      },
      "client": {
        "server": {
          "socket": {
            "address": "***********",
            "domain": "example.com",
            "port": 80
          },
          "address": "***********",
          "port": 80
        },
        "resend_count": 0,
        "url": {
          "full": "http://example.com"
        }
      },
      "server": {
        "route": "/index",
        "address": "***********",
        "port": 8080,
        "socket": {
         ...
        },
        "client": {
         ...
         }
        },
        "url": {
         ...
        }
      }
    }
  }
}
```

Dans cette approche, vous pouvez voir les `traceId` adresses HTTP et HTTP client/server `ip` qui peuvent être corrélées aux journaux ELB afin de mieux comprendre le comportement et l'état du système.

**Nouvelle commande de requête de corrélation**  
Voici la nouvelle commande qui permettrait ce type d'investigation :

```
source alb_logs, traces | where alb_logs.ip="10.0.0.1" AND alb_logs.cloud.provider="aws"| 
correlate exact fields(traceId, ip) scope(@timestamp, 1D) mapping(alb_logs.ip = traces.attributes.http.server.address, alb_logs.traceId = traces.traceId )
```

Voici ce que fait chaque partie de la commande :

1. `source alb_logs, traces`- Cela permet de sélectionner les sources de données que vous souhaitez corréler.

1. `where ip="10.0.0.1" AND cloud.provider="aws"`- Cela permet de réduire la portée de votre recherche.

1. `correlate exact fields(traceId, ip)`- Cela indique au système de corréler les données en fonction des correspondances exactes des champs suivants :
   + Le `ip` champ possède une condition de filtre explicite, il sera donc utilisé dans la corrélation pour toutes les sources de données.
   + Le `traceId` champ ne comporte aucun filtre explicite, il correspondra donc aux mêmes TraceID dans toutes les sources de données.

Les noms des champs indiquent la signification logique de la fonction dans la commande de corrélation. La condition de jointure réelle dépend de l'instruction de mappage que vous fournissez.

Le terme `exact` signifie que les instructions de corrélation nécessiteront que tous les champs correspondent afin de répondre à l'instruction de requête.

Le terme `approximate` tentera de correspondre dans le meilleur des cas et ne rejettera pas les lignes présentant des correspondances partielles.

**Aborder différents types de mappage de terrain**  
Dans les cas où le même champ logique (tel que`ip`) porte des noms différents selon vos sources de données, vous devez fournir le mappage explicite des champs de chemin. Pour résoudre ce problème, vous pouvez étendre vos conditions de corrélation pour qu'elles correspondent à différents noms de champs ayant des significations logiques similaires. Voici comment vous pouvez procéder :

```
alb_logs.ip = traces.attributes.http.server.address, alb_logs.traceId = traces.traceId    
```

Pour chaque champ participant à la jointure par corrélation, vous devez fournir une instruction de mappage pertinente qui inclut toutes les tables à joindre par cette commande de corrélation.

**Exemple**  
Dans cet exemple, il existe 2 sources : `alb_logs, traces`

Il y a 2 champs : `traceId, ip`

Il existe deux instructions de mappage : `alb_logs.ip = traces.attributes.http.server.address, alb_logs.traceId = traces.traceId`

**Définition des délais de corrélation**  
Pour simplifier le travail effectué par le moteur d'exécution (pilote), vous pouvez ajouter l'instruction scope. Cela indique explicitement à la requête de jointure l'heure à laquelle elle doit effectuer cette recherche.

`scope(@timestamp, 1D)`je

Dans cet exemple, le champ de recherche se concentre sur une base quotidienne, de sorte que les corrélations apparaissant le même jour sont regroupées. Ce mécanisme de cadrage simplifie et permet un meilleur contrôle des résultats, permettant une résolution de recherche incrémentielle en fonction de vos besoins.

**Soutenir les conducteurs**  
La nouvelle commande de corrélation est en fait une commande de jointure « cachée ». Par conséquent, seuls les pilotes PPL suivants prennent en charge cette commande. Dans ces pilotes, la commande de corrélation sera directement traduite dans le plan logique Catalyst Join approprié.

**Exemple**  
`source alb_logs, traces, metrics | where ip="10.0.0.1" AND cloud.provider="aws"| correlate exact on (ip, port) scope(@timestamp, 2018-07-02T22:23:00, 1 D)`

**Plan logique :**

```
'Project [*]
+- 'Join Inner, ('ip && 'port)
   :- 'Filter (('ip === "10.0.0.1" & 'cloud.provider === "aws") & inTimeScope('@timestamp, "2018-07-02T22:23:00", "1 D"))
      +- 'UnresolvedRelation [alb_logs]
   +- 'Join Inner, ('ip & 'port)
      :- 'Filter (('ip === "10.0.0.1" & 'cloud.provider === "aws") & inTimeScope('@timestamp, "2018-07-02T22:23:00", "1 D"))
         +- 'UnresolvedRelation [traces]
      +- 'Filter (('ip === "10.0.0.1" & 'cloud.provider === "aws") & inTimeScope('@timestamp, "2018-07-02T22:23:00", "1 D"))
         +- 'UnresolvedRelation [metrics]
```

Le moteur Catalyst optimise cette requête en fonction de l'ordre des jointures le plus efficace.

#### commande dedup
<a name="supported-ppl-dedup-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `dedup` commande pour supprimer des documents identiques de vos résultats de recherche en fonction des champs spécifiés.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
dedup [int] <field-list> [keepempty=<bool>] [consecutive=<bool>] 
```

**`int`**
+ Facultatif. 
+ La `dedup` commande conserve plusieurs événements pour chaque combinaison lorsque vous la spécifiez<int>. Le nombre pour <int>doit être supérieur à 0. Si vous ne spécifiez aucun chiffre, seul le premier événement est conservé. Tous les autres doublons sont supprimés des résultats. 
+ Valeur par défaut : 1

**`keepempty`**
+ Facultatif. 
+ Si la valeur est vraie, conserve les documents pour lesquels un champ de la liste de champs possède une valeur NULL ou est MANQUANT.
+ Valeur par défaut : false

**`consecutive`**
+ Facultatif.
+ Si vrai, supprime uniquement les événements comportant des combinaisons de valeurs dupliquées consécutives.
+ Valeur par défaut : false

**`field-list`**
+ Obligatoire. 
+ Liste de champs séparés par des virgules. Au moins un champ est obligatoire.

**Exemple 1 : Déduplication par un champ**  
Cet exemple montre comment dédupliquer des documents à l'aide du champ de genre.

Requête PPL :

```
os> source=accounts | dedup gender | fields account_number, gender;
fetched rows / total rows = 2/2
+------------------+----------+
| account_number   | gender   |
|------------------+----------|
| 1                | M        |
| 13               | F        |
+------------------+----------+
```

**Exemple 2 : conserver 2 doublons de documents**  
L'exemple montre comment dédupliquer des documents avec le champ de genre, en conservant deux doublons.

Requête PPL :

```
os> source=accounts | dedup 2 gender | fields account_number, gender;
fetched rows / total rows = 3/3
+------------------+----------+
| account_number   | gender   |
|------------------+----------|
| 1                | M        |
| 6                | M        |
| 13               | F        |
+------------------+----------+
```

**Exemple 3 : conserver ou ignorer le champ vide par défaut**  
L'exemple montre comment déduper le document en conservant le champ de valeur nulle.

Requête PPL :

```
os> source=accounts | dedup email keepempty=true | fields account_number, email;
fetched rows / total rows = 4/4
+------------------+-----------------------+
| account_number   | email                 |
+------------------+-----------------------+
| 1                | john_doe@example.com  |
| 6                | jane_doe@example.com  |
| 13               | null                  |
| 18               | juan_li@example.com   |
+------------------+-----------------------+
```

L'exemple montre comment déduper le document en ignorant le champ de valeur vide.

Requête PPL :

```
os> source=accounts | dedup email | fields account_number, email;
fetched rows / total rows = 3/3
+------------------+-----------------------+
| account_number   | email                 |
+------------------+-----------------------+
| 1                | john_doe@example.com  |
| 6                | jane_doe@example.com  |
| 18               | juan_li@example.com   |
+------------------+-----------------------+
```

**Exemple 4 : Déduplication dans des documents consécutifs**  
L'exemple montre comment procéder à la déduplication dans des documents consécutifs.

Requête PPL :

```
os> source=accounts | dedup gender consecutive=true | fields account_number, gender;
fetched rows / total rows = 3/3
+------------------+----------+
| account_number   | gender   |
+------------------+----------+
| 1                | M        |
| 13               | F        |
| 18               | M        |
+------------------+----------+
```

**Exemples supplémentaires**
+ `source = table | dedup a | fields a,b,c`
+ `source = table | dedup a,b | fields a,b,c`
+ `source = table | dedup a keepempty=true | fields a,b,c`
+ `source = table | dedup a,b keepempty=true | fields a,b,c`
+ `source = table | dedup 1 a | fields a,b,c`
+ `source = table | dedup 1 a,b | fields a,b,c`
+ `source = table | dedup 1 a keepempty=true | fields a,b,c`
+ `source = table | dedup 1 a,b keepempty=true | fields a,b,c`
+ `source = table | dedup 2 a | fields a,b,c`
+ `source = table | dedup 2 a,b | fields a,b,c`
+ `source = table | dedup 2 a keepempty=true | fields a,b,c`
+ `source = table | dedup 2 a,b keepempty=true | fields a,b,c`
+ `source = table | dedup 1 a consecutive=true| fields a,b,c`(la déduplication consécutive n'est pas prise en charge)

**Limitation**
+ Pour `| dedup 2 a, b keepempty=false`

  ```
  DataFrameDropColumns('_row_number_)
  +- Filter ('_row_number_ <= 2) // allowed duplication = 2
     +- Window [row_number() windowspecdefinition('a, 'b, 'a ASC NULLS FIRST, 'b ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS _row_number_], ['a, 'b], ['a ASC NULLS FIRST, 'b ASC NULLS FIRST]
         +- Filter (isnotnull('a) AND isnotnull('b)) // keepempty=false
            +- Project
               +- UnresolvedRelation
  ```
+ Pour `| dedup 2 a, b keepempty=true`

  ```
  Union
  :- DataFrameDropColumns('_row_number_)
  :  +- Filter ('_row_number_ <= 2)
  :     +- Window [row_number() windowspecdefinition('a, 'b, 'a ASC NULLS FIRST, 'b ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS _row_number_], ['a, 'b], ['a ASC NULLS FIRST, 'b ASC NULLS FIRST]
  :        +- Filter (isnotnull('a) AND isnotnull('b))
  :           +- Project
  :              +- UnresolvedRelation
  +- Filter (isnull('a) OR isnull('b))
     +- Project
        +- UnresolvedRelation
  ```

#### décrire la commande
<a name="supported-ppl-describe-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `describe` commande pour obtenir des informations détaillées sur la structure et les métadonnées des tables, des schémas et des catalogues. Voici différents exemples et cas d'utilisation de la `describe` commande.

**Décrire**
+ `describe table`Cette commande est égale à la commande `DESCRIBE EXTENDED table` SQL
+ `describe schema.table`
+ `describe schema.`table``
+ `describe catalog.schema.table`
+ `describe catalog.schema.`table``
+ `describe `catalog`.`schema`.`table``

#### commande eval
<a name="supported-ppl-eval-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

La `eval` commande évalue l'expression et ajoute le résultat au résultat de la recherche.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
eval <field>=<expression> ["," <field>=<expression> ]...    
```
+ `field`: Obligatoire. Si le nom du champ n'existe pas, un nouveau champ est ajouté. Si le nom du champ existe déjà, il sera remplacé.
+  `expression`: Obligatoire. Toute expression prise en charge par le système.

**Exemple 1 : créer le nouveau champ**  
Cet exemple montre comment créer un nouveau `doubleAge` champ pour chaque document. Le nouveau `doubleAge` est le résultat de l'évaluation de l'âge multiplié par 2.

Requête PPL :

```
os> source=accounts | eval doubleAge = age * 2 | fields age, doubleAge ;
fetched rows / total rows = 4/4
+-------+-------------+
| age   | doubleAge   |
|-------+-------------|
| 32    | 64          |
| 36    | 72          |
| 28    | 56          |
| 33    | 66          |
+-------+-------------+
```

**Exemple 2 : remplacer le champ existant**  
Cet exemple montre comment remplacer le champ d'âge existant par l'âge plus 1.

Requête PPL :

```
os> source=accounts | eval age = age + 1 | fields age ;
fetched rows / total rows = 4/4
+-------+
| age   |
|-------|
| 33    |
| 37    |
| 29    |
| 34    |
+-------+
```

**Exemple 3 : créer le nouveau champ avec le champ défini dans eval**  
Cet exemple montre comment créer un nouveau `ddAge` champ avec un champ défini dans la commande eval. Le nouveau champ `ddAge` est le résultat de l'évaluation `doubleAge` multiplié par 2, `doubleAge` défini dans la commande eval.

Requête PPL :

```
os> source=accounts | eval doubleAge = age * 2, ddAge = doubleAge * 2 | fields age, doubleAge, ddAge ;
fetched rows / total rows = 4/4
+-------+-------------+---------+
| age   | doubleAge   | ddAge   |
|-------+-------------+---------|
| 32    | 64          | 128     |
| 36    | 72          | 144     |
| 28    | 56          | 112     |
| 33    | 66          | 132     |
+-------+-------------+---------+
```

Hypothèses :`a`,`b`, `c` existe-t-il des champs dans `table`

**Exemples supplémentaires**
+ `source = table | eval f = 1 | fields a,b,c,f`
+ `source = table | eval f = 1`(champs de sortie a, b, c, f)
+ `source = table | eval n = now() | eval t = unix_timestamp(a) | fields n,t`
+ `source = table | eval f = a | where f > 1 | sort f | fields a,b,c | head 5`
+ `source = table | eval f = a * 2 | eval h = f * 2 | fields a,f,h`
+ `source = table | eval f = a * 2, h = f * 2 | fields a,f,h`
+ `source = table | eval f = a * 2, h = b | stats avg(f) by h`
+ `source = table | eval f = ispresent(a)`
+ `source = table | eval r = coalesce(a, b, c) | fields r`
+ `source = table | eval e = isempty(a) | fields e`
+ `source = table | eval e = isblank(a) | fields e`
+ `source = table | eval f = case(a = 0, 'zero', a = 1, 'one', a = 2, 'two', a = 3, 'three', a = 4, 'four', a = 5, 'five', a = 6, 'six', a = 7, 'se7en', a = 8, 'eight', a = 9, 'nine')`
+ `source = table | eval f = case(a = 0, 'zero', a = 1, 'one' else 'unknown')`
+ `source = table | eval f = case(a = 0, 'zero', a = 1, 'one' else concat(a, ' is an incorrect binary digit'))`
+ `source = table | eval f = a in ('foo', 'bar') | fields f`
+ `source = table | eval f = a not in ('foo', 'bar') | fields f`

**Eval avec exemple de cas :**  


```
source = table | eval e = eval status_category =
case(a >= 200 AND a < 300, 'Success',
a >= 300 AND a < 400, 'Redirection',
a >= 400 AND a < 500, 'Client Error',
a >= 500, 'Server Error'
else 'Unknown')
```

**Eval avec un autre exemple de cas :**  


Hypothèses :`a`,`b`, `c` existe-t-il des champs dans `table`

**Exemples supplémentaires**
+ `source = table | eval f = 1 | fields a,b,c,f`
+ `source = table | eval f = 1`(champs de sortie a, b, c, f)
+ `source = table | eval n = now() | eval t = unix_timestamp(a) | fields n,t`
+ `source = table | eval f = a | where f > 1 | sort f | fields a,b,c | head 5`
+ `source = table | eval f = a * 2 | eval h = f * 2 | fields a,f,h`
+ `source = table | eval f = a * 2, h = f * 2 | fields a,f,h`
+ `source = table | eval f = a * 2, h = b | stats avg(f) by h`
+ `source = table | eval f = ispresent(a)`
+ `source = table | eval r = coalesce(a, b, c) | fields r`
+ `source = table | eval e = isempty(a) | fields e`
+ `source = table | eval e = isblank(a) | fields e`
+ `source = table | eval f = case(a = 0, 'zero', a = 1, 'one', a = 2, 'two', a = 3, 'three', a = 4, 'four', a = 5, 'five', a = 6, 'six', a = 7, 'se7en', a = 8, 'eight', a = 9, 'nine')`
+ `source = table | eval f = case(a = 0, 'zero', a = 1, 'one' else 'unknown')`
+ `source = table | eval f = case(a = 0, 'zero', a = 1, 'one' else concat(a, ' is an incorrect binary digit'))`
+ `source = table | eval f = a in ('foo', 'bar') | fields f`
+ `source = table | eval f = a not in ('foo', 'bar') | fields f`

**Eval avec exemple de cas :**  


```
source = table | eval e = eval status_category =
case(a >= 200 AND a < 300, 'Success',
a >= 300 AND a < 400, 'Redirection',
a >= 400 AND a < 500, 'Client Error',
a >= 500, 'Server Error'
else 'Unknown')
```

**Eval avec un autre exemple de cas :**  


```
source = table |  where ispresent(a) |
eval status_category =
 case(a >= 200 AND a < 300, 'Success',
  a >= 300 AND a < 400, 'Redirection',
  a >= 400 AND a < 500, 'Client Error',
  a >= 500, 'Server Error'
  else 'Incorrect HTTP status code'
 )
 | stats count() by status_category
```

**Limitations**
+ Le remplacement de champs existants n'est pas pris en charge. Les requêtes qui tentent de le faire généreront des exceptions avec le message « La référence « a » est ambiguë ».

  ```
  - `source = table | eval a = 10 | fields a,b,c`
  - `source = table | eval a = a * 2 | stats avg(a)`
  - `source = table | eval a = abs(a) | where a > 0`
  - `source = table | eval a = signum(a) | where a < 0`
  ```

#### commande eventstats
<a name="supported-ppl-eventstats-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `eventstats` commande pour enrichir les données de vos événements avec des statistiques récapitulatives calculées. Il fonctionne en analysant des champs spécifiques au sein de vos événements, en calculant diverses mesures statistiques, puis en ajoutant ces résultats sous forme de nouveaux champs à chaque événement d'origine.

**Principaux aspects des statistiques sur les événements**

1. Il effectue des calculs sur l'ensemble des résultats ou au sein de groupes définis.

1. Les événements d'origine restent intacts et de nouveaux champs ont été ajoutés pour contenir les résultats statistiques.

1. La commande est particulièrement utile pour effectuer des analyses comparatives, identifier les valeurs aberrantes ou fournir un contexte supplémentaire à des événements individuels.

**Différence entre les statistiques et les statistiques des événements**  
Les `eventstats` commandes `stats` and sont toutes deux utilisées pour calculer des statistiques, mais elles présentent des différences importantes dans leur mode de fonctionnement et dans ce qu'elles produisent.

**Format de sortie**
+ `stats`: produit un tableau récapitulatif contenant uniquement les statistiques calculées.
+ `eventstats`: ajoute les statistiques calculées sous forme de nouveaux champs aux événements existants, en préservant les données d'origine.

**Rétention des événements**
+ `stats`: réduit le jeu de résultats au seul résumé statistique, en supprimant les événements individuels.
+ `eventstats`: conserve tous les événements d'origine et ajoute de nouveaux champs avec les statistiques calculées.

**Cas d’utilisation**
+ `stats`: Idéal pour créer des rapports de synthèse ou des tableaux de bord. Souvent utilisée comme commande finale pour résumer les résultats.
+ `eventstats`: Utile lorsque vous devez enrichir des événements avec un contexte statistique pour une analyse ou un filtrage plus approfondis. Peut être utilisé en cours de recherche pour ajouter des statistiques qui pourront être utilisées dans les commandes suivantes.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
eventstats <aggregation>... [by-clause]    
```

**agrégation**
+ Obligatoire. 
+ Fonction d'agrégation. 
+ L'argument de l'agrégation doit être un champ.

**clause**
+ Facultatif.
+ Syntaxe : `by [span-expression,] [field,]...`
+ La clause by peut inclure des champs et des expressions tels que des fonctions scalaires et des fonctions d'agrégation. Vous pouvez également utiliser la clause span pour diviser un champ spécifique en compartiments à intervalles égaux. La commande eventstats effectue ensuite une agrégation en fonction de ces compartiments span.
+ Par défaut : si vous ne spécifiez pas de clause by, la commande eventstats agrège l'ensemble des résultats.

**étendre l'expression**
+ Facultatif, au plus un.
+ Syntaxe : `span(field_expr, interval_expr)`
+ L'unité de l'expression d'intervalle est l'unité naturelle par défaut. Toutefois, pour les champs de type date et heure, vous devez spécifier l'unité dans l'expression d'intervalle lorsque vous utilisez des unités de date/heure.

  Par exemple, pour diviser le champ `age` en compartiments sur 10 ans, utilisez`span(age, 10)`. Pour les champs temporels, vous pouvez diviser un `timestamp` champ en intervalles horaires à l'aide `span(timestamp, 1h)` de.


**Unités de temps disponibles**  

| Unités d'intervalle d'intervalle | 
| --- | 
| milliseconde (ms) | 
| seconde (s) | 
| minute (m, distinction majuscules et minuscules) | 
| heure (h) | 
| jour (d) | 
| semaine (s) | 
| mois (M, distinction majuscules et minuscules) | 
| trimestre (q) | 
| année (y) | 

**Fonctions d'agrégation**  


**`COUNT`**  
`COUNT`renvoie le nombre d'expr dans les lignes récupérées par une instruction SELECT.

Pour les CloudWatch journaux, les requêtes d'utilisation ne `COUNT` sont pas prises en charge. 

Exemple :

```
os> source=accounts | eventstats count();
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+--------------------+------------+--------------------------+--------+-------+---------+
| account_number | balance  | firstname | lastname | age | gender | address            | employer   | email                    | city   | state | count() |
+----------------+----------+-----------+----------+-----+--------+--------------------+------------+--------------------------+--------+-------+---------+
| 1              | 39225    | Jane      | Doe      | 32  | M      | *** Any Lane       | AnyCorp    | janedoe@anycorp.com      | Brogan | IL    | 4       |
| 6              | 5686     | Mary      | Major    | 36  | M      | 671 Example Street | AnyCompany | marymajor@anycompany.com | Dante  | TN    | 4       |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | 789 Any Street     | AnyOrg     |                          | Nogal  | VA    | 4       |
| 18             | 4180     | Juan      | Li       | 33  | M      | *** Example Court  |            | juanli@exampleorg.com    | Orick  | MD    | 4       |
+----------------+----------+-----------+----------+-----+--------+--------------------+------------+--------------------------+--------+-------+---------+
```

**`SUM`**  
`SUM(expr)`renvoie la somme de expr.

Exemple :

```
os> source=accounts | eventstats sum(age) by gender;
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+-----------------------+------------+--------------------------+--------+-------+--------------------+
| account_number | balance  | firstname | lastname | age | gender | address               | employer   | email                    | city   | state | sum(age) by gender |
+----------------+----------+-----------+----------+-----+--------+-----------------------+------------+--------------------------+--------+-------+--------------------+
| 1              | 39225    | Jane      | Doe      | 32  | M      | 880 Any Lane          | AnyCorp    | janedoe@anycorp.com      | Brogan | IL    | 101                |
| 6              | 5686     | Mary      | Major    | 36  | M      | 671 Example Street    | AnyCompany | marymajor@anycompany.com | Dante  | TN    | 101                |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | 789 Any Street        | AnyOrg     |                          | Nogal  | VA    | 28                 |
| 18             | 4180     | Juan      | Li       | 33  | M      | 467 Example Court     |            | juanli@exampleorg.com    | Orick  | MD    | 101                |
+----------------+----------+-----------+----------+-----+--------+-----------------------+------------+--------------------------+--------+-------+--------------------+
```

**`AVG`**  
`AVG(expr)`renvoie la valeur moyenne de expr.

Exemple :

```
os> source=accounts | eventstats avg(age) by gender;
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+-----------------------+------------+---------------------------+--------+-------+--------------------+
| account_number | balance  | firstname | lastname | age | gender | address               | employer    | email                    | city   | state | avg(age) by gender |
+----------------+----------+-----------+----------+-----+--------+-----------------------+------------+---------------------------+--------+-------+--------------------+
| 1              | 39225    | Jane      | Doe      | 32  | M      | 880 Any Lane          | AnyCorp     | janedoe@anycorp.com      | Brogan | IL    | 33.67              |
| 6              | 5686     | Mary      | Major    | 36  | M      | 671 Example Street    | Any Company | marymajor@anycompany.com | Dante  | TN    | 33.67              |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | 789 Any Street        | AnyOrg      |                          | Nogal  | VA    | 28.00              |
| 18             | 4180     | Juan      | Li       | 33  | M      | 467 Example Court     |             | juanli@exampleorg.com    | Orick  | MD    | 33.67              |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+--------------------+
```

**MAX**  
`MAX(expr)`Renvoie la valeur maximale de expr.

Exemple

```
os> source=accounts | eventstats max(age);
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+-----------+
| account_number | balance  | firstname | lastname | age | gender | address               | employer    | email                    | city   | state | max(age)  |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+-----------+
| 1              | 39225    | Jane      | Doe      | 32  | M      | 880 Any Lane          | AnyCorp     | janedoe@anycorp.com      | Brogan | IL    | 36        |
| 6              | 5686     | Mary      | Major    | 36  | M      | 671 Example Street    | Any Company | marymajor@anycompany.com | Dante  | TN    | 36        |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | 789 Any Street        | AnyOrg      |                          | Nogal  | VA    | 36        |
| 18             | 4180     | Juan      | Li       | 33  | M      | *** Example Court     |             | juanli@exampleorg.com    | Orick  | MD    | 36        |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+-----------+
```

**MIN**  
`MIN(expr)`Renvoie la valeur minimale de expr.

Exemple

```
os> source=accounts | eventstats min(age);
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+-----------+
| account_number | balance  | firstname | lastname | age | gender | address               | employer    | email                    | city   | state | min(age)  |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+-----------+
| 1              | 39225    | Jane      | Doe      | 32  | M      | 880 Any Lane          | AnyCorp     | janedoe@anycorp.com      | Brogan | IL    | 28        |
| 6              | 5686     | Mary      | Major    | 36  | M      | 671 Example Street    | Any Company | marymajor@anycompany.com | Dante  | TN    | 28        |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | *** Any Street        | AnyOrg      |                          | Nogal  | VA    | 28        |
| 18             | 4180     | Juan      | Li       | 33  | M      | *** Example Court     |             | juanli@exampleorg.com    | Orick  | MD    | 28        |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+-----------+
```

**STDDEV\$1SAMP**  
`STDDEV_SAMP(expr)`Renvoie l'écart type de l'échantillon de expr.

Exemple

```
os> source=accounts | eventstats stddev_samp(age);
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+------------------------+
| account_number | balance  | firstname | lastname | age | gender | address               | employer    | email                    | city   | state | stddev_samp(age)       |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+------------------------+
| 1              | 39225    | Jane      | Doe      | 32  | M      | *** Any Lane          | AnyCorp     | janedoe@anycorp.com      | Brogan | IL    | 3.304037933599835      |
| 6              | 5686     | Mary      | Major    | 36  | M      | 671 Example Street    | Any Company | marymajor@anycompany.com | Dante  | TN    | 3.304037933599835      |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | 789 Any Street        | AnyOrg      |                          | Nogal  | VA    | 3.304037933599835      |
| 18             | 4180     | Juan      | Li       | 33  | M      | 467 Example Court     |             | juanli@exampleorg.com    | Orick  | MD    | 3.304037933599835      |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+------------------------+
```

**STDDEV\$1POP**  
`STDDEV_POP(expr)`Renvoie l'écart type de population de expr.

Exemple

```
os> source=accounts | eventstats stddev_pop(age);
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+------------------------+
| account_number | balance  | firstname | lastname | age | gender | address               | employer    | email                    | city   | state | stddev_pop(age)        |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+------------------------+
| 1              | 39225    | Jane      | Doe      | 32  | M      | 880 Any Lane          | AnyCorp     | janedoe@anycorp.com      | Brogan | IL    | 2.****************     |
| 6              | 5686     | Mary      | Major    | 36  | M      | *** Example Street    | Any Company | marymajor@anycompany.com | Dante  | TN    | 2.****************     |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | *** Any Street        | AnyOrg      |                          | Nogal  | VA    | 2.****************     |
| 18             | 4180     | Juan      | Li       | 33  | M      | *** Example Court     |             | juanli@exampleorg.com    | Orick  | MD    | 2.****************     |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+------------------------+
```

**PERCENTILE ou PERCENTILE\$1APPROX**  
`PERCENTILE(expr, percent)`ou `PERCENTILE_APPROX(expr, percent)` Renvoie la valeur percentile approximative de expr au pourcentage spécifié.

**pourcentage**
+ Le nombre doit être une constante comprise entre 0 et 100.

Exemple

```
os> source=accounts | eventstats percentile(age, 90) by gender;
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+--------------------------------+
| account_number | balance  | firstname | lastname | age | gender | address               | employer    | email                    | city   | state | percentile(age, 90) by gender  |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+--------------------------------+
| 1              | 39225    | Jane      | Doe      | 32  | M      | *** Any Lane          | AnyCorp     | janedoe@anycorp.com      | Brogan | IL    | 36                             |
| 6              | 5686     | Mary      | Major    | 36  | M      | 671 Example Street    | Any Company | marymajor@anycompany.com | Dante  | TN    | 36                             |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | 789 Any Street        | AnyOrg      |                          | Nogal  | VA    | 28                             |
| 18             | 4180     | Juan      | Li       | 33  | M      | *** Example Court     |             | juanli@exampleorg.com    | Orick  | MD    | 36                             |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+--------------------------------+
```

**Exemple 1 : calculer la moyenne, la somme et le nombre d'un champ par groupe**  
L'exemple montre comment calculer l'âge moyen, la somme de l'âge et le nombre d'événements de tous les comptes regroupés par sexe.

```
os> source=accounts | eventstats avg(age) as avg_age, sum(age) as sum_age, count() as count by gender;
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+-----------+-----------+-------+
| account_number | balance  | firstname | lastname | age | gender | address               | employer    | email                    | city   | state | avg_age   | sum_age   | count |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+-----------+-----------+-------+
| 1              | 39225    | Jane      | Doe      | 32  | M      | *** Any Lane          | AnyCorp     | janedoe@anycorp.com      | Brogan | IL    | 33.666667 | 101       | 3     |
| 6              | 5686     | Mary      | Major    | 36  | M      | 671 Example Street    | Any Company | marymajor@anycompany.com | Dante  | TN    | 33.666667 | 101       | 3     |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | 789 Any Street        | AnyOrg      |                          | Nogal  | VA    | 28.000000 | 28        | 1     |
| 18             | 4180     | Juan      | Li       | 33  | M      | *** Example Court     |             | juanli@exampleorg.com    | Orick  | MD    | 33.666667 | 101       | 3     |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+-----------+-----------+-------+
```

**Exemple 2 : calculer le nombre par intervalle**  
L'exemple obtient le décompte de l'âge par intervalle de 10 ans.

```
os> source=accounts | eventstats count(age) by span(age, 10) as age_span
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+----------+
| account_number | balance  | firstname | lastname | age | gender | address               | employer    | email                    | city   | state | age_span |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+----------+
| 1              | 39225    | Jane      | Doe      | 32  | M      | *** Any Lane          | AnyCorp     | janedoe@anycorp.com      | Brogan | IL    | 3        |
| 6              | 5686     | Mary      | Major    | 36  | M      | 671 Example Street    | Any Company | marymajor@anycompany.com | Dante  | TN    | 3        |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | 789 Any Street        | AnyOrg      |                          | Nogal  | VA    | 1        |
| 18             | 4180     | Juan      | Li       | 33  | M      | *** Example Court     |             | juanli@exampleorg.com    | Orick  | MD    | 3        |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+--------------------------+--------+-------+----------+
```

**Exemple 3 : calculer le nombre par sexe et par intervalle**  
L'exemple obtient le décompte de l'âge par intervalle de 5 ans et le groupe par sexe.

```
os> source=accounts | eventstats count() as cnt by span(age, 5) as age_span, gender
fetched rows / total rows = 4/4
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+---------------------------+--------+-------+-----+
| account_number | balance  | firstname | lastname | age | gender | address               | employer    | email                     | city   | state | cnt |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+---------------------------+--------+-------+-----+
| 1              | 39225    | Jane      | Doe      | 32  | M      | *** Any Lane          | AnyCorp     | janedoe@anycorp.com       | Brogan | IL    | 2   |
| 6              | 5686     | Mary      | Majo     | 36  | M      | 671 Example Street    | Any Company | hattiebond@anycompany.com | Dante  | TN    | 1   |
| 13             | 32838    | Nikki     | Wolf     | 28  | F      | *** Any Street        | AnyOrg      |                           | Nogal  | VA    | 1   |
| 18             | 4180     | Juan      | Li       | 33  | M      | *** Example Court     |             | juanli@exampleorg.com     | Orick  | MD    | 2   |
+----------------+----------+-----------+----------+-----+--------+-----------------------+-------------+---------------------------+--------+-------+-----+
```

**Usage**
+ `source = table | eventstats avg(a)`
+ `source = table | where a < 50 | eventstats avg(c)`
+ `source = table | eventstats max(c) by b`
+ `source = table | eventstats count(c) by b | head 5`
+ `source = table | eventstats distinct_count(c)`
+ `source = table | eventstats stddev_samp(c)`
+ `source = table | eventstats stddev_pop(c)`
+ `source = table | eventstats percentile(c, 90)`
+ `source = table | eventstats percentile_approx(c, 99)`

**Agrégations avec span**  

+ `source = table | eventstats count(a) by span(a, 10) as a_span`
+ `source = table | eventstats sum(age) by span(age, 5) as age_span | head 2`
+ `source = table | eventstats avg(age) by span(age, 20) as age_span, country | sort - age_span | head 2`

**Agrégations avec plage horaire (fonction de fenêtrage automatique)**  

+ `source = table | eventstats sum(productsAmount) by span(transactionDate, 1d) as age_date | sort age_date`
+ `source = table | eventstats sum(productsAmount) by span(transactionDate, 1w) as age_date, productId`

**Les agrégations sont regroupées par plusieurs niveaux**  

+ `source = table | eventstats avg(age) as avg_state_age by country, state | eventstats avg(avg_state_age) as avg_country_age by country`
+ `source = table | eventstats avg(age) as avg_city_age by country, state, city | eval new_avg_city_age = avg_city_age - 1 | eventstats avg(new_avg_city_age) as avg_state_age by country, state | where avg_state_age > 18 | eventstats avg(avg_state_age) as avg_adult_country_age by country`

#### commande d'extension
<a name="supported-ppl-expand-commands"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `expand` commande pour aplatir un champ de type :
+ `Array<Any>`
+ `Map<Any>`

**Syntaxe**  
Utilisez la syntaxe suivante :

```
expand <field> [As alias]
```

**field**
+ Le champ à étendre (exploser). Doit être d'un type compatible.

**alias**
+ Facultatif. Le nom à utiliser à la place du nom de champ d'origine.

**Usage**  
La `expand` commande produit une ligne pour chaque élément du tableau ou du champ de carte spécifié, où :
+ Les éléments du tableau deviennent des lignes individuelles.
+ Les paires clé-valeur de la carte sont divisées en lignes distinctes, chaque valeur-clé étant représentée par une ligne.
+ Lorsqu'un alias est fourni, les valeurs éclatées sont représentées sous l'alias au lieu du nom du champ d'origine.
+ Cela peut être utilisé en combinaison avec d'autres commandes, telles que `stats``eval`, et `parse` pour manipuler ou extraire des données après l'extension.

**Exemples**
+ `source = table | expand employee | stats max(salary) as max by state, company`
+ `source = table | expand employee as worker | stats max(salary) as max by state, company`
+ `source = table | expand employee as worker | eval bonus = salary * 3 | fields worker, bonus`
+ `source = table | expand employee | parse description '(?<email>.+@.+)' | fields employee, email`
+ `source = table | eval array=json_array(1, 2, 3) | expand array as uid | fields name, occupation, uid`
+ `source = table | expand multi_valueA as multiA | expand multi_valueB as multiB`

#### expliquer la commande
<a name="supported-ppl-explain-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

La `explain` commande vous aide à comprendre les plans d'exécution des requêtes, ce qui vous permet d'analyser et d'optimiser vos requêtes pour de meilleures performances. Cette introduction fournit un aperçu concis de l'objectif de la commande explain et de son importance dans l'optimisation des requêtes.

**Comment**
+ `source=accounts | top gender // finds most common gender of all the accounts`(commentaire en ligne)
+ `source=accounts | dedup 2 gender /* dedup the document with gender field keep 2 duplication */ | fields account_number, gender`(bloquer les commentaires)

**Décrire**
+ `describe table`Cette commande est égale à la commande `DESCRIBE EXTENDED table` SQL
+ `describe schema.table`
+ `describe schema.`table``
+ `describe catalog.schema.table`
+ `describe catalog.schema.`table``
+ `describe `catalog`.`schema`.`table``

**Expliquer**
+ `explain simple | source = table | where a = 1 | fields a,b,c`
+ `explain extended | source = table`
+ `explain codegen | source = table | dedup a | fields a,b,c`
+ `explain cost | source = table | sort a | fields a,b,c`
+ `explain formatted | source = table | fields - a`
+ `explain simple | describe table`

**Champs**
+ `source = table`
+ `source = table | fields a,b,c`
+ `source = table | fields + a,b,c`
+ `source = table | fields - b,c`
+ `source = table | eval b1 = b | fields - b1,c`

**Résumé du champ**
+ `source = t | fieldsummary includefields=status_code nulls=false`
+ `source = t | fieldsummary includefields= id, status_code, request_path nulls=true`
+ `source = t | where status_code != 200 | fieldsummary includefields= status_code nulls=true`

**Champ imbriqué**
+ `source = catalog.schema.table1, catalog.schema.table2 | fields A.nested1, B.nested1`
+ `source = catalog.table | where struct_col2.field1.subfield > 'valueA' | sort int_col | fields int_col, struct_col.field1.subfield, struct_col2.field1.subfield`
+ `source = catalog.schema.table | where struct_col2.field1.subfield > 'valueA' | sort int_col | fields int_col, struct_col.field1.subfield, struct_col2.field1.subfield`

**Filtres**
+ `source = table | where a = 1 | fields a,b,c`
+ `source = table | where a >= 1 | fields a,b,c`
+ `source = table | where a < 1 | fields a,b,c`
+ `source = table | where b != 'test' | fields a,b,c`
+ `source = table | where c = 'test' | fields a,b,c | head 3`
+ `source = table | where ispresent(b)`
+ `source = table | where isnull(coalesce(a, b)) | fields a,b,c | head 3`
+ `source = table | where isempty(a)`
+ `source = table | where isblank(a)`
+ `source = table | where case(length(a) > 6, 'True' else 'False') = 'True'`
+ `source = table | where a not in (1, 2, 3) | fields a,b,c`
+ `source = table | where a between 1 and 4`- Remarque : Cela renvoie a >= 1 et a <= 4, c'est-à-dire [1, 4]
+ `source = table | where b not between '2024-09-10' and '2025-09-10'`- Remarque : cela renvoie b >= '\$1\$1\$1\$1\$1\$1\$1\$1\$1\$1' et b <= '2025-09-10'
+ `source = table | where cidrmatch(ip, '***********/24')`
+ `source = table | where cidrmatch(ipv6, '2003:db8::/32')`
+ `source = table | trendline sma(2, temperature) as temp_trend`

**Requêtes liées à l'IP**
+ `source = table | where cidrmatch(ip, '**************')`
+ `source = table | where isV6 = false and isValid = true and cidrmatch(ipAddress, '**************')`
+ `source = table | where isV6 = true | eval inRange = case(cidrmatch(ipAddress, '2003:***::/32'), 'in' else 'out') | fields ip, inRange`

**Filtres complexes**  


```
source = table | eval status_category =
case(a >= 200 AND a < 300, 'Success',
    a >= 300 AND a < 400, 'Redirection',
    a >= 400 AND a < 500, 'Client Error',
    a >= 500, 'Server Error'
else 'Incorrect HTTP status code')
| where case(a >= 200 AND a < 300, 'Success',
    a >= 300 AND a < 400, 'Redirection',
    a >= 400 AND a < 500, 'Client Error',
    a >= 500, 'Server Error'
else 'Incorrect HTTP status code'
) = 'Incorrect HTTP status code'
```

```
source = table
| eval factor = case(a > 15, a - 14, isnull(b), a - 7, a < 3, a + 1 else 1)
| where case(factor = 2, 'even', factor = 4, 'even', factor = 6, 'even', factor = 8, 'even' else 'odd') = 'even'
| stats count() by factor
```

**Filtres avec conditions logiques**
+ `source = table | where c = 'test' AND a = 1 | fields a,b,c`
+ `source = table | where c != 'test' OR a > 1 | fields a,b,c | head 1`
+ `source = table | where c = 'test' NOT a > 1 | fields a,b,c`

**Éval**  
Hypothèses :`a`,`b`, `c` existe-t-il des champs dans `table`
+ `source = table | eval f = 1 | fields a,b,c,f`
+ `source = table | eval f = 1`(champs de sortie a, b, c, f)
+ `source = table | eval n = now() | eval t = unix_timestamp(a) | fields n,t`
+ `source = table | eval f = a | where f > 1 | sort f | fields a,b,c | head 5`
+ `source = table | eval f = a * 2 | eval h = f * 2 | fields a,f,h`
+ `source = table | eval f = a * 2, h = f * 2 | fields a,f,h`
+ `source = table | eval f = a * 2, h = b | stats avg(f) by h`
+ `source = table | eval f = ispresent(a)`
+ `source = table | eval r = coalesce(a, b, c) | fields r`
+ `source = table | eval e = isempty(a) | fields e`
+ `source = table | eval e = isblank(a) | fields e`
+ `source = table | eval f = case(a = 0, 'zero', a = 1, 'one', a = 2, 'two', a = 3, 'three', a = 4, 'four', a = 5, 'five', a = 6, 'six', a = 7, 'se7en', a = 8, 'eight', a = 9, 'nine')`
+ `source = table | eval f = case(a = 0, 'zero', a = 1, 'one' else 'unknown')`
+ `source = table | eval f = case(a = 0, 'zero', a = 1, 'one' else concat(a, ' is an incorrect binary digit'))`
+ `source = table | eval digest = md5(fieldName) | fields digest`
+ `source = table | eval digest = sha1(fieldName) | fields digest`
+ `source = table | eval digest = sha2(fieldName,256) | fields digest`
+ `source = table | eval digest = sha2(fieldName,512) | fields digest`

#### commande fillnull
<a name="supported-ppl-fillnull-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

**Description**  
Utilisez la `fillnull` commande pour remplacer les valeurs nulles par une valeur spécifiée dans un ou plusieurs champs de vos résultats de recherche. 

**Syntaxe**  
Utilisez la syntaxe suivante :

```
fillnull [with <null-replacement> in <nullable-field>["," <nullable-field>]] | [using <source-field> = <null-replacement> [","<source-field> = <null-replacement>]]
```
+ null-replacement : obligatoire. La valeur utilisée pour remplacer les valeurs nulles.
+ champ nul : obligatoire. Référence de champ. Les valeurs nulles de ce champ seront remplacées par la valeur spécifiée dans null-replacement.

**Exemple 1 : remplir un champ nul**  
L'exemple montre comment utiliser fillnull sur un seul champ :

```
os> source=logs | fields status_code | eval input=status_code | fillnull with 0 in status_code;
| input | status_code |
|-------|-------------|
| 403   | 403         |
| 403   | 403         |
| NULL  | 0           |
| NULL  | 0           |
| 200   | 200         |
| 404   | 404         |
| 500   | 500         |
| NULL  | 0           |
| 500   | 500         |
| 404   | 404         |
| 200   | 200         |
| 500   | 500         |
| NULL  | 0           |
| NULL  | 0           |
| 404   | 404         |
```

**Exemple 2 : Fillnull appliqué à plusieurs champs**  
L'exemple montre que fillnull est appliqué à plusieurs champs.

```
os> source=logs | fields request_path, timestamp | eval input_request_path=request_path, input_timestamp = timestamp | fillnull with '???' in request_path, timestamp;
| input_request_path | input_timestamp       | request_path | timestamp              |
|------------------------------------------------------------------------------------|
| /contact           | NULL                  | /contact     | ???                    |
| /home              | NULL                  | /home        | ???                    |
| /about             | 2023-10-01 10:30:00   | /about       | 2023-10-01 10:30:00    |
| /home              | 2023-10-01 10:15:00   | /home        | 2023-10-01 10:15:00    |
| NULL               | 2023-10-01 10:20:00   | ???          | 2023-10-01 10:20:00    |
| NULL               | 2023-10-01 11:05:00   | ???          | 2023-10-01 11:05:00    |
| /about             | NULL                  | /about       | ???                    |
| /home              | 2023-10-01 10:00:00   | /home        | 2023-10-01 10:00:00    |
| /contact           | NULL                  | /contact     | ???                    |
| NULL               | 2023-10-01 10:05:00   | ???          | 2023-10-01 10:05:00    |
| NULL               | 2023-10-01 10:50:00   | ???          | 2023-10-01 10:50:00    |
| /services          | NULL                  | /services    | ???                    |
| /home              | 2023-10-01 10:45:00   | /home        | 2023-10-01 10:45:00    |
| /services          | 2023-10-01 11:00:00   | /services    | 2023-10-01 11:00:00    |
| NULL               | 2023-10-01 10:35:00   | ???          | 2023-10-01 10:35:00    |
```

**Exemple 3 : Fillnull appliqué à plusieurs champs avec différentes valeurs de remplacement nulles.**  
L'exemple montre fillnull avec différentes valeurs utilisées pour remplacer les valeurs nulles.
+ `/error`sur le `request_path` terrain
+ `1970-01-01 00:00:00`sur le `timestamp` terrain

```
os> source=logs | fields request_path, timestamp | eval input_request_path=request_path, input_timestamp = timestamp | fillnull using request_path = '/error', timestamp='1970-01-01 00:00:00';

| input_request_path | input_timestamp       | request_path | timestamp              |
|------------------------------------------------------------------------------------|
| /contact           | NULL                  | /contact     | 1970-01-01 00:00:00    |
| /home              | NULL                  | /home        | 1970-01-01 00:00:00    |
| /about             | 2023-10-01 10:30:00   | /about       | 2023-10-01 10:30:00    |
| /home              | 2023-10-01 10:15:00   | /home        | 2023-10-01 10:15:00    |
| NULL               | 2023-10-01 10:20:00   | /error       | 2023-10-01 10:20:00    |
| NULL               | 2023-10-01 11:05:00   | /error       | 2023-10-01 11:05:00    |
| /about             | NULL                  | /about       | 1970-01-01 00:00:00    |
| /home              | 2023-10-01 10:00:00   | /home        | 2023-10-01 10:00:00    |
| /contact           | NULL                  | /contact     | 1970-01-01 00:00:00    |
| NULL               | 2023-10-01 10:05:00   | /error       | 2023-10-01 10:05:00    |
| NULL               | 2023-10-01 10:50:00   | /error       | 2023-10-01 10:50:00    |
| /services          | NULL                  | /services    | 1970-01-01 00:00:00    |
| /home              | 2023-10-01 10:45:00   | /home        | 2023-10-01 10:45:00    |
| /services          | 2023-10-01 11:00:00   | /services    | 2023-10-01 11:00:00    |
| NULL               | 2023-10-01 10:35:00   | /error       | 2023-10-01 10:35:00    |
```

#### commande fields
<a name="supported-ppl-fields-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `fields` commande pour conserver ou supprimer des champs dans les résultats de recherche.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
field [+|-] <field-list> 
```
+ `index`: Facultatif. 

  Si le signe plus (\$1) est utilisé, seuls les champs spécifiés dans la liste des champs seront conservés. 

  Si le signe moins (-) est utilisé, tous les champs spécifiés dans la liste des champs seront supprimés. 

  *Par défaut* : \$1
+ `field list`: Obligatoire. Liste de champs séparés par des virgules à conserver ou à supprimer.

**Exemple 1 : sélectionner les champs spécifiés dans le résultat**  
Cet exemple montre comment récupérer des `lastname` champs `account_number``firstname`, et à partir des résultats de recherche.

Requête PPL :

```
os> source=accounts | fields account_number, firstname, lastname;
fetched rows / total rows = 4/4
+------------------+-------------+------------+
| account_number   | firstname   | lastname   |
|------------------+-------------+------------|
| 1                | Jane        | Doe        |
| 6                | John        | Doe        |
| 13               | Jorge       | Souza      |
| 18               | Juan        | Li         |
+------------------+-------------+------------+
```

**Exemple 2 : Supprimer les champs spécifiés du résultat**  
Cet exemple montre comment supprimer le `account_number` champ des résultats de recherche.

Requête PPL :

```
os> source=accounts | fields account_number, firstname, lastname | fields - account_number ;
fetched rows / total rows = 4/4
+-------------+------------+
| firstname   | lastname   |
|-------------+------------|
| Jane        | Doe        |
| John        | Doe        |
| Jorge       | Souza      |
| Juan        | Li         |
+-------------+------------+
```

**Exemples supplémentaires**
+ `source = table`
+ `source = table | fields a,b,c`
+ `source = table | fields + a,b,c`
+ `source = table | fields - b,c`
+ `source = table | eval b1 = b | fields - b1,c`

Exemple de champs imbriqués :

```
`source = catalog.schema.table1, catalog.schema.table2 | fields A.nested1, B.nested1`
`source = catalog.table | where struct_col2.field1.subfield > 'valueA' | sort int_col | fields  int_col, struct_col.field1.subfield, struct_col2.field1.subfield`
`source = catalog.schema.table | where struct_col2.field1.subfield > 'valueA' | sort int_col | fields  int_col, struct_col.field1.subfield, struct_col2.field1.subfield`
```

#### commande aplatir
<a name="supported-ppl-flatten-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la commande aplatir pour développer les champs des types suivants :
+ `struct<?,?>`
+ `array<struct<?,?>>`

**Syntaxe**  
Utilisez la syntaxe suivante :

```
flatten <field>
```
+ *champ* : champ à aplatir. Le champ doit être d'un type compatible.

**Schema** (Schéma)


| col\$1name | data\$1type | 
| --- | --- | 
| \$1heure | chaîne | 
| ponts | <length:bigint, name:string>tableau <struc> | 
| city | chaîne | 
| couleur | structure<alt:bigint, lat:double, long:double> | 
| country | chaîne | 

**Données**  



| \$1heure | ponts | city | couleur | country | 
| --- | --- | --- | --- | --- | 
| 13/09/2024 À 12:00:00 | [\$1801, Tower Bridge\$1, \$1928, London Bridge\$1] | Londres | \$135, 51,5074, -0,1278\$1 | Angleterre | 
| 13/09/2024 À 12:00:00 | [\$1232, Pont-Neuf\$1, \$1160, Pont Alexandre III\$1] | Paris | \$135, 48,8566, 2,3522\$1 | France | 
| 13/09/2024 À 12:00:00 | [\$148, Pont du Rialto\$1, \$111, Pont des Soupirs\$1] | Venise | \$12, 45,4408, 12,3155\$1 | Italie | 
| 13/09/2024 À 12:00:00 | [\$1\$1\$1\$1, Pont Charles\$1, \$1343, Pont de la Légion\$1] | Prague | \$1200, 50,0755, 14,4378\$1 | République tchèque | 
| 13/09/2024 À 12:00:00 | [\$1375, Pont à chaînes\$1, \$1333, Pont de la Liberté\$1] | Budapest | \$196, 47,4979, 19,0402\$1 | Hongrie | 
| 13/09/1990 12:00:00 | NULL | Varsovie | NULL | Pologne | 

**Exemple 1 : aplatir la structure**  
Cet exemple montre comment aplatir un champ de structure.

Requête PPL :

```
source=table | flatten coor
```


| \$1heure | ponts | city | country | alt | lat | long | 
| --- | --- | --- | --- | --- | --- | --- | 
| 13/09/2024 À 12:00:00 | [\$1801, Tower Bridge\$1, \$1928, London Bridge\$1] | Londres | Angleterre | 35 | 51,5074 | -0,1278 | 
| 13/09/2024 À 12:00:00 | [\$1232, Pont-Neuf\$1, \$1160, Pont Alexandre III\$1] | Paris | France | 35 | 48,8566 | 2,3522 | 
| 13/09/2024 À 12:00:00 | [\$148, Pont du Rialto\$1, \$111, Pont des Soupirs\$1] | Venise | Italie | 2 | 45,4408 | 12,3155 | 
| 13/09/2024 À 12:00:00 | [\$1516, Pont Charles\$1, \$1343, Pont de la Légion\$1] | Prague | République tchèque | 200 | 50,0755 | 14,4378 | 
| 13/09/2024 À 12:00:00 | [\$1375, Pont à chaînes\$1, \$1333, Pont de la Liberté\$1] | Budapest | Hongrie | 96 | 47,4979 | 19,0402 | 
| 13/09/1990 12:00:00 | NULL | Varsovie | Pologne | NULL | NULL | NULL | 

**Exemple 2 : aplatir un tableau**  
L'exemple montre comment aplatir un tableau de champs de structure.

Requête PPL :

```
source=table | flatten bridges
```


| \$1heure | city | couleur | country | longueur | name | 
| --- | --- | --- | --- | --- | --- | 
| 13/09/2024 À 12:00:00 | Londres | \$135, 51,5074, -0,1278\$1 | Angleterre | 801 | Tower Bridge | 
| 13/09/2024 À 12:00:00 | Londres | \$135, 51,5074, -0,1278\$1 | Angleterre | 928 | Pont de Londres | 
| 13/09/2024 À 12:00:00 | Paris | \$135, 48,8566, 2,3522\$1 | France | 232 | Pont-Neuf | 
| 13/09/2024 À 12:00:00 | Paris | \$135, 48,8566, 2,3522\$1 | France | 160 | Pont Alexandre III | 
| 13/09/2024 À 12:00:00 | Venise | \$12, 45,4408, 12,3155\$1 | Italie | 48 | Pont du Rialto | 
| 13/09/2024 À 12:00:00 | Venise | \$12, 45,4408, 12,3155\$1 | Italie | 11 | Pont des Soupirs | 
| 13/09/2024 À 12:00:00 | Prague | \$1200, 50,0755, 14,4378\$1 | République tchèque | 516 | Pont Charles | 
| 13/09/2024 À 12:00:00 | Prague | \$1200, 50,0755, 14,4378\$1 | République tchèque | 343 | Pont de la Legion | 
| 13/09/2024 À 12:00:00 | Budapest | \$196, 47,4979, 19,0402\$1 | Hongrie | 375 | Pont à chaînes | 
| 13/09/2024 À 12:00:00 | Budapest | \$196, 47,4979, 19,0402\$1 | Hongrie | 333 | Pont de la Liberté | 
| 13/09/1990 12:00:00 | Varsovie | NULL | Pologne | NULL | NULL | 

**Exemple 3 : aplatir un tableau et une structure**  
Cet exemple montre comment aplatir plusieurs champs.

Requête PPL :

```
source=table | flatten bridges | flatten coor
```


| \$1heure | city | country | longueur | name | alt | lat | long | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
| 13/09/2024 À 12:00:00 | Londres | Angleterre | 801 | Tower Bridge | 35 | 51,5074 | -0,1278 | 
| 13/09/2024 À 12:00:00 | Londres | Angleterre | 928 | Pont de Londres | 35 | 51,5074 | -0,1278 | 
| 13/09/2024 À 12:00:00 | Paris | France | 232 | Pont-Neuf | 35 | 48,8566 | 2,3522 | 
| 13/09/2024 À 12:00:00 | Paris | France | 160 | Pont Alexandre III | 35 | 48,8566 | 2,3522 | 
| 13/09/2024 À 12:00:00 | Venise | Italie | 48 | Pont du Rialto | 2 | 45,4408 | 12,3155 | 
| 13/09/2024 À 12:00:00 | Venise | Italie | 11 | Pont des Soupirs | 2 | 45,4408 | 12,3155 | 
| 13/09/2024 À 12:00:00 | Prague | République tchèque | 516 | Pont Charles | 200 | 50,0755 | 14,4378 | 
| 13/09/2024 À 12:00:00 | Prague | République tchèque | 343 | Pont de la Legion | 200 | 50,0755 | 14,4378 | 
| 13/09/2024 À 12:00:00 | Budapest | Hongrie | 375 | Pont à chaînes | 96 | 47,4979 | 19,0402 | 
| 13/09/2024 À 12:00:00 | Budapest | Hongrie | 333 | Pont de la Liberté | 96 | 47,4979 | 19,0402 | 
| 13/09/1990 12:00:00 | Varsovie | Pologne | NULL | NULL | NULL | NULL | NULL | 

#### commande grok
<a name="supported-ppl-grok-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

La `grok` commande analyse un champ de texte avec un motif grok et ajoute les résultats au résultat de recherche.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
grok <field> <pattern>
```

**field**
+ Obligatoire. 
+ Le champ doit être un champ de texte.

**pattern**
+ Obligatoire. 
+ Le modèle grok utilisé pour extraire de nouveaux champs d'un champ de texte donné. 
+ Si un nouveau nom de champ existe déjà, il remplacera le champ d'origine.

**Modèle grok**  
Le modèle grok est utilisé pour faire correspondre le champ de texte de chaque document afin d'extraire de nouveaux champs.

**Exemple 1 : créer le nouveau champ**  
Cet exemple montre comment créer un nouveau champ `host` pour chaque document. `host`sera le nom d'hôte indiqué après `@` dans le `email` champ. L'analyse d'un champ nul renverra une chaîne vide.

```
os> source=accounts | grok email '.+@%{HOSTNAME:host}' | fields email, host ;
fetched rows / total rows = 4/4
+-------------------------+-------------+
| email                   | host        |
|-------------------------+-------------|
| jane_doe@example.com    | example.com |
| arnav_desai@example.net | example.net |
| null                    |             |
| juan_li@example.org     | example.org |
+-------------------------+-------------+
```

**Exemple 2 : remplacer le champ existant**  
Cet exemple montre comment remplacer le `address` champ existant en supprimant le numéro de rue.

```
os> source=accounts | grok address '%{NUMBER} %{GREEDYDATA:address}' | fields address ;
fetched rows / total rows = 4/4
+------------------+
| address          |
|------------------|
| Example Lane     |
| Any Street       |
| Main Street      |
| Example Court    |
+------------------+
```

**Exemple 3 : utilisation de grok pour analyser les journaux**  
Cet exemple montre comment utiliser grok pour analyser des journaux bruts.

```
os> source=apache | grok message '%{COMMONAPACHELOG}' | fields COMMONAPACHELOG, timestamp, response, bytes ;
fetched rows / total rows = 4/4
+-----------------------------------------------------------------------------------------------------------------------------+----------------------------+------------+---------+
| COMMONAPACHELOG                                                                                                             | timestamp                  | response   | bytes   |
|-----------------------------------------------------------------------------------------------------------------------------+----------------------------+------------+---------|
| 177.95.8.74 - upton5450 [28/Sep/2022:10:15:57 -0700] "HEAD /e-business/mindshare HTTP/1.0" 404 19927                        | 28/Sep/2022:10:15:57 -0700 | 404        | 19927   |
| 127.45.152.6 - pouros8756 [28/Sep/2022:10:15:57 -0700] "GET /architectures/convergence/niches/mindshare HTTP/1.0" 100 28722 | 28/Sep/2022:10:15:57 -0700 | 100        | 28722   |
| *************** - - [28/Sep/2022:10:15:57 -0700] "PATCH /strategize/out-of-the-box HTTP/1.0" 401 27439                      | 28/Sep/2022:10:15:57 -0700 | 401        | 27439   |
| ************** - - [28/Sep/2022:10:15:57 -0700] "POST /users HTTP/1.1" 301 9481                                             | 28/Sep/2022:10:15:57 -0700 | 301        | 9481    |
+-----------------------------------------------------------------------------------------------------------------------------+----------------------------+------------+---------+
```

**Limitations**  
La commande grok a les mêmes limites que la commande parse.

#### commande principale
<a name="supported-ppl-head-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `head` commande pour renvoyer le premier nombre N de résultats spécifiés après un décalage facultatif dans l'ordre de recherche.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
head [<size>] [from <offset>]
```

**<size>**
+ Entier facultatif. 
+ Le nombre de résultats à renvoyer. 
+ Par défaut: 10

**<offset>**
+ Entier après facultatif`from`. 
+ Le nombre de résultats à ignorer. 
+ Par défaut : 0

**Exemple 1 : Obtenir les 10 premiers résultats**  
Cet exemple montre comment récupérer un maximum de 10 résultats à partir de l'index des comptes.

Requête PPL :

```
os> source=accounts | fields firstname, age | head;
fetched rows / total rows = 4/4
+-------------+-------+
| firstname   | age   |
|-------------+-------|
| Jane        | 32    |
| John        | 36    |
| Jorge       | 28    |
| Juan        | 33    |
+-------------+-------+
```

**Exemple 2 : obtenir les N premiers résultats**  
L'exemple montre les N premiers résultats de l'index des comptes.

Requête PPL :

```
os> source=accounts | fields firstname, age | head 3;
fetched rows / total rows = 3/3
+-------------+-------+
| firstname   | age   |
|-------------+-------|
| Jane        | 32    |
| John        | 36    |
| Jorge       | 28    |
+-------------+-------+
```

**Exemple 3 : obtenir les N premiers résultats après le décalage M**  
Cet exemple montre comment récupérer les N premiers résultats après avoir ignoré M résultats de l'index des comptes.

Requête PPL :

```
os> source=accounts | fields firstname, age | head 3 from 1;
fetched rows / total rows = 3/3
+-------------+-------+
| firstname   | age   |
|-------------+-------|
| John        | 36    |
| Jorge       | 28    |
| Juan        | 33    |
+-------------+-------+
```

#### commande join
<a name="supported-ppl-join-commands"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

La commande join vous permet de combiner des données provenant de plusieurs sources sur la base de champs communs, ce qui vous permet d'effectuer des analyses complexes et d'obtenir des informations plus approfondies à partir de vos ensembles de données distribués

**Schema**  
Il existe au moins deux indices, `otel-v1-apm-span-*` (grand) et `otel-v1-apm-service-map` (petit).

Champs pertinents issus des indices :

**`otel-v1-apm-span-*`**
+ TraceID : identifiant unique pour une trace. Tous les spans d'une même trace partagent le même TraceID.
+ SpanID : identifiant unique d'une plage au sein d'une trace, attribué lors de la création de la plage.
+ parentSpanId - Le SpanID de l'espace parent de ce span. S'il s'agit d'une plage racine, ce champ doit être vide.
+ durationInNanos - La différence en nanosecondes entre StartTime et EndTime. (c'est `latency` dans l'interface utilisateur)
+ ServiceName : ressource d'où provient le span.
+ TraceGroup : nom de l'intervalle racine de la trace.

**`otel-v1-apm-service-map`**
+ ServiceName : nom du service qui a émis le span.
+ destination.domain - Le ServiceName du service appelé par ce client.
+ destination.resource - Le nom de l'intervalle (API, opération, etc.) appelé par ce client.
+ target.domain - Le ServiceName du service appelé par un client.
+ target.resource - Le nom de l'intervalle (API, opération, etc.) appelé par un client.
+ traceGroupName - Le nom de l'intervalle de niveau supérieur qui a lancé la chaîne de demandes.

**Exigence**  
Support **join** pour calculer les éléments suivants :

Pour chaque service, associez l'index span à l'index de la carte des services afin de calculer les métriques selon différents types de filtres.

Cet exemple de requête calcule le temps de latence lorsqu'il est filtré par groupe de traces `client_cancel_order` pour le `order` service. 

```
SELECT avg(durationInNanos)
FROM `otel-v1-apm-span-000001` t1
WHERE t1.serviceName = `order`
  AND ((t1.name in
          (SELECT target.resource
           FROM `otel-v1-apm-service-map`
           WHERE serviceName = `order`
             AND traceGroupName = `client_cancel_order`)
        AND t1.parentSpanId != NULL)
       OR (t1.parentSpanId = NULL
           AND t1.name = `client_cancel_order`))
  AND t1.traceId in
    (SELECT traceId
     FROM `otel-v1-apm-span-000001`
     WHERE serviceName = `order`)
```

**Migrer vers PPL**  
Syntaxe de la commande join

```
SEARCH source=<left-table>
| <other piped command>
| [joinType] JOIN
    [leftAlias]
    ON joinCriteria
    <right-table>
| <other piped command>
```

**Réécriture**  


```
SEARCH source=otel-v1-apm-span-000001
| WHERE serviceName = 'order'
| JOIN left=t1 right=t2
    ON t1.traceId = t2.traceId AND t2.serviceName = 'order'
    otel-v1-apm-span-000001 -- self inner join
| EVAL s_name = t1.name -- rename to avoid ambiguous
| EVAL s_parentSpanId = t1.parentSpanId -- RENAME command would be better when it is supported
| EVAL s_durationInNanos = t1.durationInNanos 
| FIELDS s_name, s_parentSpanId, s_durationInNanos -- reduce colunms in join
| LEFT JOIN left=s1 right=t3
    ON s_name = t3.target.resource AND t3.serviceName = 'order' AND t3.traceGroupName = 'client_cancel_order'
    otel-v1-apm-service-map
| WHERE (s_parentSpanId IS NOT NULL OR (s_parentSpanId IS NULL AND s_name = 'client_cancel_order'))
| STATS avg(s_durationInNanos) -- no need to add alias if there is no ambiguous
```

**Type de joint**
+ Syntaxe : `INNER | LEFT OUTER | CROSS`
+ Facultatif
+ Type de jointure à effectuer. La valeur par défaut est `INNER` si elle n'est pas spécifiée.

**Alias de gauche**
+ Syntaxe : `left = <leftAlias>`
+ Facultatif
+ Alias de sous-requête à utiliser avec le côté gauche de la jointure, afin d'éviter toute ambiguïté en matière de dénomination.

**Critères d'adhésion**
+ Syntaxe : `<expression>`
+ Obligatoire
+ La syntaxe commence par`ON`. Il peut s'agir de n'importe quelle expression de comparaison. En général, les critères de jointure sont les `<leftAlias>.<leftField>=<rightAlias>.<rightField>` suivants : 

  Par exemple : `l.id = r.id`. Si les critères de jointure contiennent plusieurs conditions, vous pouvez spécifier `AND` un `OR` opérateur entre chaque expression de comparaison. Par exemple, `l.id = r.id AND l.email = r.email AND (r.age > 65 OR r.age < 18)`.

**Exemples supplémentaires**  
Migration depuis une requête SQL (TPC-H Q13) :

```
SELECT c_count, COUNT(*) AS custdist
FROM
  ( SELECT c_custkey, COUNT(o_orderkey) c_count
    FROM customer LEFT OUTER JOIN orders ON c_custkey = o_custkey
        AND o_comment NOT LIKE '%unusual%packages%'
    GROUP BY c_custkey
  ) AS c_orders
GROUP BY c_count
ORDER BY custdist DESC, c_count DESC;
```

Réécrit par une requête de jointure PPL :

```
SEARCH source=customer
| FIELDS c_custkey
| LEFT OUTER JOIN
    ON c_custkey = o_custkey AND o_comment NOT LIKE '%unusual%packages%'
    orders
| STATS count(o_orderkey) AS c_count BY c_custkey
| STATS count() AS custdist BY c_count
| SORT - custdist, - c_count
```

Limitation : les sous-recherches ne sont pas prises en charge dans le côté droit de jointure.

Si les sous-recherches sont prises en charge, vous pouvez réécrire la requête PPL ci-dessus comme suit :

```
SEARCH source=customer
| FIELDS c_custkey
| LEFT OUTER JOIN
   ON c_custkey = o_custkey
   [
      SEARCH source=orders
      | WHERE o_comment NOT LIKE '%unusual%packages%'
      | FIELDS o_orderkey, o_custkey
   ]
| STATS count(o_orderkey) AS c_count BY c_custkey
| STATS count() AS custdist BY c_count
| SORT - custdist, - c_count
```

#### commande de recherche
<a name="supported-ppl-lookup-commands"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `lookup` commande pour enrichir vos données de recherche en ajoutant ou en remplaçant les données d'un index de recherche (table de dimensions). Cette commande permet d'étendre les champs d'un index avec des valeurs issues d'une table de dimensions. Vous pouvez également l'utiliser pour ajouter ou remplacer des valeurs lorsque les conditions de recherche sont remplies. La `lookup` commande est plus adaptée que la `Join` commande pour enrichir les données sources avec un ensemble de données statique.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
SEARCH source=<sourceIndex>
| <other piped command>
| LOOKUP <lookupIndex> (<lookupMappingField> [AS <sourceMappingField>])...
    [(REPLACE | APPEND) (<inputField> [AS <outputField>])...]
| <other piped command>
```

**Index de recherche**
+ Obligatoire.
+ Nom de l'index de recherche (table de dimensions).

**lookupMappingField**
+ Obligatoire.
+ Une clé de mappage dans l'index de recherche, analogue à une clé de jointure de la table de droite. Vous pouvez spécifier plusieurs champs, séparés par des virgules.

**sourceMappingField**
+ Facultatif.
+ Par défaut : < lookupMappingField >.
+ Une clé de mappage issue de la requête source, analogue à une clé de jointure située sur le côté gauche.

**Champ de saisie**
+ Facultatif.
+ Par défaut : tous les champs de l'index de recherche contenant des valeurs correspondantes sont trouvées.
+ Champ de l'index de recherche dans lequel les valeurs correspondantes sont appliquées au résultat en sortie. Vous pouvez spécifier plusieurs champs, séparés par des virgules.

**Champ de sortie**
+ Facultatif.
+ Valeur par défaut : `<inputField>`.
+ Un champ dans la sortie. Vous pouvez spécifier plusieurs champs de sortie. Si vous spécifiez un nom de champ existant à partir de la requête source, ses valeurs seront remplacées ou ajoutées par des valeurs correspondantes provenant d'InputField. Si vous spécifiez un nouveau nom de champ, il sera ajouté aux résultats.

**REMPLACER \$1 AJOUTER**
+ Facultatif.
+ Par défaut : REPLACE
+ Spécifie comment gérer les valeurs correspondantes. Si vous spécifiez REPLACE, les valeurs correspondantes dans <lookupIndex>le champ remplacent les valeurs du résultat. Si vous le spécifiez`APPEND`, les valeurs correspondantes dans <lookupIndex>le champ ne sont ajoutées qu'aux valeurs manquantes dans le résultat.

**Usage**
+ <lookupIndex>ID DE RECHERCHE EN TANT QUE CID REMPLACER LE courrier EN TANT QU'e-mail
+ <lookupIndex>NOM DE RECHERCHE REMPLACER LE courrier PAR e-mail
+ <lookupIndex>L'identifiant de recherche est un cid, le nom, l'adresse, l'adresse, le courrier, un e-mail
+ <lookupIndex>ID LOOKUP

**Exemple**  
Voir les exemples suivantes.

```
SEARCH source=<sourceIndex>
| WHERE orderType = 'Cancelled'
| LOOKUP account_list, mkt_id AS mkt_code REPLACE amount, account_name AS name
| STATS count(mkt_code), avg(amount) BY name
```

```
SEARCH source=<sourceIndex>
| DEDUP market_id
| EVAL category=replace(category, "-", ".")
| EVAL category=ltrim(category, "dvp.")
| LOOKUP bounce_category category AS category APPEND classification
```

```
SEARCH source=<sourceIndex>
| LOOKUP bounce_category category
```

#### commande d'analyse
<a name="supported-ppl-parse-command"></a>

La `parse` commande analyse un champ de texte avec une expression régulière et ajoute le résultat au résultat de la recherche.

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

**Syntaxe**  
Utilisez la syntaxe suivante :

```
parse <field> <pattern>    
```

**`field`**
+ Obligatoire. 
+ Le champ doit être un champ de texte.

**`pattern`**
+ Chaîne obligatoire. 
+ Il s'agit du modèle d'expression régulière utilisé pour extraire de nouveaux champs d'un champ de texte donné. 
+ Si un nouveau nom de champ existe déjà, il remplacera le champ d'origine.

**Expression régulière**  
Le modèle d'expression régulière est utilisé pour faire correspondre l'ensemble du champ de texte de chaque document avec le moteur Java Regex. Chaque groupe de capture nommé dans l'expression deviendra un nouveau `STRING` champ.

**Exemple 1 : créer un nouveau champ**  
L'exemple montre comment créer un nouveau champ `host` pour chaque document. `host`sera le nom d'hôte indiqué après `@` dans le `email` champ. L'analyse d'un champ nul renverra une chaîne vide.

Requête PPL :

```
os> source=accounts | parse email '.+@(?<host>.+)' | fields email, host ;
fetched rows / total rows = 4/4
+-----------------------+-------------+
| email                 | host        |
|-----------------------+-------------|
| jane_doe@example.com  | example.com |
| john_doe@example.net  | example.net |
| null                  |             |
| juan_li@example.org   | example.org |
+-----------------------+-------------+
```

**Exemple 2 : remplacer un champ existant**  
L'exemple montre comment remplacer le `address` champ existant en supprimant le numéro de rue.

Requête PPL :

```
os> source=accounts | parse address '\d+ (?<address>.+)' | fields address ;
fetched rows / total rows = 4/4
+------------------+
| address          |
|------------------|
| Example Lane     |
| Example Street   |
| Example Avenue   |
| Example Court    |
+------------------+
```

**Exemple 3 : Filtrer et trier par champ analysé casté**  
L'exemple montre comment trier les numéros de rue supérieurs à 500 dans le `address` champ.

Requête PPL :

```
os> source=accounts | parse address '(?<streetNumber>\d+) (?<street>.+)' | where cast(streetNumber as int) > 500 | sort num(streetNumber) | fields streetNumber, street ;
fetched rows / total rows = 3/3
+----------------+----------------+
| streetNumber   | street         |
|----------------+----------------|
| ***            | Example Street |
| ***            | Example Avenue |
| 880            | Example Lane   |
+----------------+----------------+
```

**Limitations**  
La commande parse comporte quelques limites :
+ Les champs définis par analyse ne peuvent pas être analysés à nouveau.

  La commande suivante ne fonctionnera pas :

  ```
  source=accounts | parse address '\d+ (?<street>.+)' | parse street '\w+ (?<road>\w+)'
  ```
+ Les champs définis par parse ne peuvent pas être remplacés par d'autres commandes.

  `where`ne correspondra à aucun document car il `street` ne peut pas être remplacé :

  ```
  source=accounts | parse address '\d+ (?<street>.+)' | eval street='1' | where street='1' ;        
  ```
+ Le champ de texte utilisé par l'analyse ne peut pas être remplacé.

  `street`ne sera pas analysé avec succès car il `address` est remplacé :

  ```
  source=accounts | parse address '\d+ (?<street>.+)' | eval address='1' ;        
  ```
+ Les champs définis par parse ne peuvent pas être filtrés ou triés après les avoir utilisés dans la `stats` commande.

  `where`dans la commande suivante ne fonctionnera pas :

  ```
  source=accounts | parse email '.+@(?<host>.+)' | stats avg(age) by host | where host=pyrami.com ;        
  ```

#### commande patterns
<a name="supported-ppl-patterns-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

La `patterns` commande extrait les modèles de journalisation d'un champ de texte et ajoute les résultats au résultat de recherche. Le regroupement des journaux en fonction de leurs modèles facilite l'agrégation des statistiques provenant de gros volumes de données de journaux à des fins d'analyse et de résolution des problèmes.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
patterns [new_field=<new-field-name>] [pattern=<pattern>] <field>    
```

**new-field-name**
+ Chaîne facultative. 
+ Il s'agit du nom du nouveau champ pour les modèles extraits.
+ La valeur par défaut est `patterns_field`. 
+ Si le nom existe déjà, il remplacera le champ d'origine.

**pattern**
+ Chaîne facultative. 
+ Il s'agit du modèle regex des caractères qui doivent être filtrés du champ de texte. 
+ En cas d'absence, le modèle par défaut est constitué de caractères alphanumériques (`[a-zA-Z\d]`).

**field**
+ Obligatoire. 
+ Le champ doit être un champ de texte.

**Exemple 1 : créer le nouveau champ**  
L'exemple montre comment utiliser des extraits de ponctuation `email` pour chaque document. L'analyse d'un champ nul renverra une chaîne vide.

Requête PPL :

```
os> source=accounts | patterns email | fields email, patterns_field ;
fetched rows / total rows = 4/4
+-----------------------+------------------+
| email                 | patterns_field   |
|-----------------------+------------------|
| jane_doe@example.com  | @.               |
| john_doe@example.net  | @.               |
| null                  |                  |
| juan_li@example.org   | @.               |
+-----------------------+------------------+
```

**Exemple 2 : Extraire les modèles de log**  
L'exemple montre comment extraire les ponctuations d'un champ de journal brut en utilisant les modèles par défaut.

Requête PPL :

```
os> source=apache | patterns message | fields message, patterns_field ;
fetched rows / total rows = 4/4
+-----------------------------------------------------------------------------------------------------------------------------+---------------------------------+
| message                                                                                                                     | patterns_field                  |
|-----------------------------------------------------------------------------------------------------------------------------+---------------------------------|
| 177.95.8.74 - upton5450 [28/Sep/2022:10:15:57 -0700] "HEAD /e-business/mindshare HTTP/1.0" 404 19927                        | ... -  [//::: -] " /-/ /."      |
| ************ - pouros8756 [28/Sep/2022:10:15:57 -0700] "GET /architectures/convergence/niches/mindshare HTTP/1.0" 100 28722 | ... -  [//::: -] " //// /."     |
| *************** - - [28/Sep/2022:10:15:57 -0700] "PATCH /strategize/out-of-the-box HTTP/1.0" 401 27439                      | ... - - [//::: -] " //--- /."   |
| ************** - - [28/Sep/2022:10:15:57 -0700] "POST /users HTTP/1.1" 301 9481                                             | ... - - [//::: -] " / /."       |
+-----------------------------------------------------------------------------------------------------------------------------+---------------------------------+
```

**Exemple 3 : Extraire des modèles de journal avec un modèle de regex personnalisé**  
L'exemple montre comment extraire les ponctuations d'un champ de journal brut à l'aide de modèles définis par l'utilisateur.

Requête PPL :

```
os> source=apache | patterns new_field='no_numbers' pattern='[0-9]' message | fields message, no_numbers ;
fetched rows / total rows = 4/4
+-----------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+
| message                                                                                                                     | no_numbers                                                                           |
|-----------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------|
| 177.95.8.74 - upton5450 [28/Sep/2022:10:15:57 -0700] "HEAD /e-business/mindshare HTTP/1.0" 404 19927                        | ... - upton [/Sep/::: -] "HEAD /e-business/mindshare HTTP/."                         |
| 127.45.152.6 - pouros8756 [28/Sep/2022:10:15:57 -0700] "GET /architectures/convergence/niches/mindshare HTTP/1.0" 100 28722 | ... - pouros [/Sep/::: -] "GET /architectures/convergence/niches/mindshare HTTP/."   |
| *************** - - [28/Sep/2022:10:15:57 -0700] "PATCH /strategize/out-of-the-box HTTP/1.0" 401 27439                      | ... - - [/Sep/::: -] "PATCH /strategize/out-of-the-box HTTP/."                       |
| ************** - - [28/Sep/2022:10:15:57 -0700] "POST /users HTTP/1.1" 301 9481                                             | ... - - [/Sep/::: -] "POST /users HTTP/."                                            |
+-----------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+
```

**Limitation**  
La commande patterns présente les mêmes limites que la commande parse.

#### commande rare
<a name="supported-ppl-rare-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `rare` commande pour rechercher le tuple de valeurs le moins courant de tous les champs de la liste de champs.

**Note**  
Un maximum de 10 résultats sont renvoyés pour chaque tuple distinct de valeurs des champs groupés.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
rare [N] <field-list> [by-clause] rare_approx [N] <field-list> [by-clause]
```

**liste de champs**
+ Obligatoire. 
+ Liste de noms de champs séparés par des virgules.

**clause**
+ Facultatif. 
+ Un ou plusieurs champs par lesquels regrouper les résultats.

**N**
+ Le nombre de résultats à renvoyer. 
+ Par défaut: 10

**rare\$1approx**
+ Le nombre approximatif de (n) champs rares en utilisant la [cardinalité estimée par l'algorithme HyperLogLog \$1\$1](https://spark.apache.org/docs/latest/sql-ref-functions-builtin.html).

**Exemple 1 : trouver les valeurs les moins courantes dans un champ**  
L'exemple permet de trouver le sexe le moins courant de tous les comptes.

Requête PPL :

```
os> source=accounts | rare gender;
os> source=accounts | rare_approx 10 gender;
os> source=accounts | rare_approx gender;
fetched rows / total rows = 2/2
+----------+
| gender   |
|----------|
| F        |
| M        |
+----------+
```

**Exemple 2 : Trouvez les valeurs les moins courantes organisées par sexe**  
L'exemple permet de trouver l'âge le moins courant de tous les comptes regroupés par sexe.

Requête PPL :

```
os> source=accounts | rare 5 age by gender;
os> source=accounts | rare_approx 5 age by gender;
fetched rows / total rows = 4/4
+----------+-------+
| gender   | age   |
|----------+-------|
| F        | 28    |
| M        | 32    |
| M        | 33    |
| M        | 36    |
+----------+-------+
```

#### renommer la commande
<a name="supported-ppl-rename-command"></a>

Utilisez la `rename` commande pour modifier le nom d'un ou de plusieurs champs dans les résultats de recherche.

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

**Syntaxe**  
Utilisez la syntaxe suivante :

```
rename <source-field> AS <target-field>["," <source-field> AS <target-field>]...    
```

**champ-source**
+ Obligatoire. 
+ Il s'agit du nom du champ que vous souhaitez renommer.

**champ cible**
+ Obligatoire. 
+ Il s'agit du nom que vous souhaitez renommer.

**Exemple 1 : renommer un champ**  
Cet exemple montre comment renommer un seul champ.

Requête PPL :

```
os> source=accounts | rename account_number as an | fields an;
fetched rows / total rows = 4/4
+------+
| an   |
|------|
| 1    |
| 6    |
| 13   |
| 18   |
+------+
```

**Exemple 2 : renommer plusieurs champs**  
Cet exemple montre comment renommer plusieurs champs.

Requête PPL :

```
os> source=accounts | rename account_number as an, employer as emp | fields an, emp;
fetched rows / total rows = 4/4
+------+---------+
| an   | emp     |
|------+---------|
| 1    | Pyrami  |
| 6    | Netagy  |
| 13   | Quility |
| 18   | null    |
+------+---------+
```

**Limitations**
+ Le remplacement d'un champ existant n'est pas pris en charge :

  ```
  source=accounts | grok address '%{NUMBER} %{GREEDYDATA:address}' | fields address        
  ```

#### commande de recherche
<a name="supported-ppl-search-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `search` commande pour récupérer des documents à partir d'un index. La `search` commande ne peut être utilisée que comme première commande dans une requête PPL.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
search source=[<remote-cluster>:]<index> [boolean-expression]    
```

**search**
+ Facultatif.
+ Mots clés de recherche, qui peuvent être omis.

**index**
+ Obligatoire.
+ La commande de recherche doit spécifier l'index à partir duquel effectuer la requête. 
+ Le nom de l'index peut être préfixé par `<cluster name>:` pour les recherches entre clusters.

**expression booléenne**
+ Facultatif. 
+ Toute expression dont le résultat est une valeur booléenne.

**Exemple 1 : récupérer toutes les données**  
L'exemple montre comment récupérer tout le document depuis l'index des comptes.

Requête PPL :

```
os> source=accounts;
+------------------+-------------+----------------------+-----------+----------+--------+----------------+---------+-------+-----------------------+------------+
| account_number   | firstname   | address              | balance   | gender   | city   | employer       | state   | age   | email                 | lastname   |
|------------------+-------------+----------------------+-----------+----------+--------+----------------+---------+-------+-----------------------+------------|
| 1                | Jorge       | *** Any Lane         | 39225     | M        | Brogan | ExampleCorp    | IL      | 32    | jane_doe@example.com  | Souza      |
| 6                | John        | *** Example Street   | 5686      | M        | Dante  | AnyCorp        | TN      | 36    | john_doe@example.com  | Doe        |
| 13               | Jane        | *** Any Street       | *****     | F        | Nogal  | ExampleCompany | VA      | 28    | null                  | Doe        |
| 18               | Juan        | *** Example Court    | 4180      | M        | Orick  | null           | MD      | 33    | juan_li@example.org   | Li         |
+------------------+-------------+----------------------+-----------+----------+--------+----------------+---------+-------+-----------------------+------------+
```

**Exemple 2 : récupérer des données avec une condition**  
L'exemple montre comment récupérer tout le document depuis l'index des comptes avec.

Requête PPL :

```
os> SEARCH source=accounts account_number=1 or gender="F";
+------------------+-------------+--------------------+-----------+----------+--------+----------------+---------+-------+-------------------------+------------+
| account_number   | firstname   | address            | balance   | gender   | city   | employer       | state   | age   | email                -  | lastname   |
|------------------+-------------+--------------------+-----------+----------+--------+----------------+---------+-------+-------------------------+------------|
| 1                | Jorge       | *** Any Lane       | *****     | M        | Brogan | ExampleCorp    | IL      | 32    | jorge_souza@example.com | Souza      |
| 13               | Jane        | *** Any Street     | *****     | F        | Nogal  | ExampleCompany | VA      | 28    | null                    | Doe        |
+------------------+-------------+--------------------+-----------+----------+--------+-----------------+---------+-------+------------------------+------------+
```

#### commande de tri
<a name="supported-ppl-sort-command"></a>

Utilisez la `sort` commande pour trier les résultats de recherche en fonction des champs spécifiés.

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

**Syntaxe**  
Utilisez la syntaxe suivante :

```
sort <[+|-] sort-field>...
```

**[\$1\$1-]**
+ Facultatif. 
+ Le signe plus [\$1] représente l'ordre croissant avec NULL/MISSING les valeurs en premier.
+ Le signe moins [-] représente l'ordre décroissant avec NULL/MISSING les dernières valeurs.
+ Par défaut : ordre croissant avec NULL/MISSING les valeurs en premier.

**champ de tri**
+ Obligatoire. 
+ Champ utilisé pour le tri.

**Exemple 1 : Trier selon un champ**  
L'exemple montre comment trier le document avec le champ d'âge par ordre croissant.

Requête PPL :

```
os> source=accounts | sort age | fields account_number, age;
fetched rows / total rows = 4/4
+------------------+-------+
| account_number   | age   |
|------------------+-------|
| 13               | 28    |
| 1                | 32    |
| 18               | 33    |
| 6                | 36    |
+------------------+-------+
```

**Exemple 2 : trier selon un champ et renvoyer tous les résultats**  
L'exemple montre comment trier le document avec le champ d'âge par ordre croissant.

Requête PPL :

```
os> source=accounts | sort age | fields account_number, age;
fetched rows / total rows = 4/4
+------------------+-------+
| account_number   | age   |
|------------------+-------|
| 13               | 28    |
| 1                | 32    |
| 18               | 33    |
| 6                | 36    |
+------------------+-------+
```

**Exemple 3 : Trier par un champ par ordre décroissant**  
L'exemple montre comment trier le document avec le champ d'âge par ordre décroissant.

Requête PPL :

```
os> source=accounts | sort - age | fields account_number, age;
fetched rows / total rows = 4/4
+------------------+-------+
| account_number   | age   |
|------------------+-------|
| 6                | 36    |
| 18               | 33    |
| 1                | 32    |
| 13               | 28    |
+------------------+-------+
```

**Exemple 4 : Trier selon plusieurs champs**  
L'exemple montre comment trier le document avec le champ de genre par ordre croissant et le champ d'âge par ordre décroissant.

Requête PPL :

```
os> source=accounts | sort + gender, - age | fields account_number, gender, age;
fetched rows / total rows = 4/4
+------------------+----------+-------+
| account_number   | gender   | age   |
|------------------+----------+-------|
| 13               | F        | 28    |
| 6                | M        | 36    |
| 18               | M        | 33    |
| 1                | M        | 32    |
+------------------+----------+-------+
```

**Exemple 5 : le tri par champ inclut une valeur nulle**  
L'exemple montre comment trier le champ employeur selon l'option par défaut (ordre croissant et valeur nulle en premier). Le résultat indique que la valeur nulle se trouve dans la première ligne.

Requête PPL :

```
os> source=accounts | sort employer | fields employer;
fetched rows / total rows = 4/4
+------------+
| employer   |
|------------|
| null       |
| AnyCompany |
| AnyCorp    |
| AnyOrgty   |
+------------+
```

#### commande stats
<a name="supported-ppl-stats-command"></a>

Utilisez la `stats` commande pour calculer l'agrégation à partir des résultats de recherche.

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

**Gestion des valeurs NULL/MANQUANTES**  



**Gestion des valeurs NULL/MANQUANTES**  

| Fonction | NULL | MANQUANT | 
| --- | --- | --- | 
| COUNT | Non compté | Non compté | 
| SUM | Ignorer | Ignorer | 
| AVG | Ignorer | Ignorer | 
| MAX | Ignorer | Ignorer | 
| MIN | Ignorer | Ignorer | 

**Syntaxe**  
Utilisez la syntaxe suivante :

```
stats <aggregation>... [by-clause]    
```

**agrégation**
+ Obligatoire. 
+ Fonction d'agrégation appliquée à un champ.

**clause**
+ Facultatif.
+ Syntaxe : `by [span-expression,] [field,]...`
+ Spécifie les champs et les expressions permettant de regrouper les résultats de l'agrégation. La clause secondaire vous permet de regrouper vos résultats d'agrégation à l'aide de champs et d'expressions. Vous pouvez utiliser des fonctions scalaires, des fonctions d'agrégation et même des expressions d'intervalle pour diviser des champs spécifiques en compartiments à intervalles égaux. 
+ Par défaut : si non `<by-clause>` est spécifié, la commande stats renvoie une seule ligne représentant l'agrégation sur l'ensemble de résultats.

**étendre l'expression**  

+ Facultatif, au plus un.
+ Syntaxe : `span(field_expr, interval_expr)`
+ L'unité de l'expression d'intervalle est l'unité naturelle par défaut. Si le champ est de type date et heure et que l'intervalle est exprimé en date/time unités, vous spécifiez l'unité dans l'expression d'intervalle.
+ Par exemple, diviser le `age` champ en seaux d'ici 10 ans, on dirait. `span(age, 10)` Pour diviser un champ d'horodatage en intervalles horaires, utilisez. `span(timestamp, 1h)`


**Unités de temps disponibles**  

| Unités d'intervalle d'intervalle | 
| --- | 
| milliseconde (ms) | 
| seconde (s) | 
| minute (m, distinction majuscules et minuscules) | 
| heure (h) | 
| jour (d) | 
| semaine (s) | 
| mois (M, distinction majuscules et minuscules) | 
| trimestre (q) | 
| année (y) | 

**Fonctions d'agrégation**  


**`COUNT`**  
Renvoie le nombre d'expr dans les lignes récupérées par une instruction SELECT.

Exemple :

```
os> source=accounts | stats count();
fetched rows / total rows = 1/1
+-----------+
| count()   |
|-----------|
| 4         |
+-----------+
```

**`SUM`**  
`SUM(expr)`À utiliser pour renvoyer la somme de expr.

Exemple

```
os> source=accounts | stats sum(age) by gender;
fetched rows / total rows = 2/2
+------------+----------+
| sum(age)   | gender   |
|------------+----------|
| 28         | F        |
| 101        | M        |
+------------+----------+
```

**`AVG`**  
`AVG(expr)`À utiliser pour renvoyer la valeur moyenne de expr.

Exemple

```
os> source=accounts | stats avg(age) by gender;
fetched rows / total rows = 2/2
+--------------------+----------+
| avg(age)           | gender   |
|--------------------+----------|
| 28.0               | F        |
| 33.666666666666664 | M        |
+--------------------+----------+
```

**`MAX`**  
`MAX(expr)`À utiliser pour renvoyer la valeur maximale de expr.

Exemple

```
os> source=accounts | stats max(age);
fetched rows / total rows = 1/1
+------------+
| max(age)   |
|------------|
| 36         |
+------------+
```

**`MIN`**  
`MIN(expr)`À utiliser pour renvoyer la valeur minimale de expr.

Exemple

```
os> source=accounts | stats min(age);
fetched rows / total rows = 1/1
+------------+
| min(age)   |
|------------|
| 28         |
+------------+
```

**`STDDEV_SAMP`**  
`STDDEV_SAMP(expr)`À utiliser pour renvoyer l'écart type de l'échantillon de expr.

Exemple :

```
os> source=accounts | stats stddev_samp(age);
fetched rows / total rows = 1/1
+--------------------+
| stddev_samp(age)   |
|--------------------|
| 3.304037933599835  |
+--------------------+
```

**STDDEV\$1POP**  
`STDDEV_POP(expr)`À utiliser pour renvoyer l'écart type de population de expr.

Exemple :

```
os> source=accounts | stats stddev_pop(age);
fetched rows / total rows = 1/1
+--------------------+
| stddev_pop(age)    |
|--------------------|
| 2.**************** |
+--------------------+
```

**PRENDRE**  
`TAKE(field [, size])`À utiliser pour renvoyer les valeurs d'origine d'un champ. Il ne fournit aucune garantie quant à l'ordre des valeurs.

**field**
+ Obligatoire. 
+ Le champ doit être un champ de texte.

**size**
+ Entier facultatif. 
+ Le nombre de valeurs doit être renvoyé. 
+ La valeur par défaut est 10.

**Exemple**  


```
os> source=accounts | stats take(firstname);
fetched rows / total rows = 1/1
+-----------------------------+
| take(firstname)             |
|-----------------------------|
| [Jane, Mary, Nikki, Juan    |
+-----------------------------+
```

**PERCENTILE ou PERCENTILE\$1APPROX**  
Utilisez `PERCENTILE(expr, percent)` ou `PERCENTILE_APPROX(expr, percent)` pour renvoyer la valeur percentile approximative de expr au pourcentage spécifié.

**pourcentage**
+ Le nombre doit être une constante comprise entre 0 et 100.

**Exemple**  


```
os> source=accounts | stats percentile(age, 90) by gender;
fetched rows / total rows = 2/2
+-----------------------+----------+
| percentile(age, 90)   | gender   |
|-----------------------+----------|
| 28                    | F        |
| 36                    | M        |
+-----------------------+----------+
```

**Exemple 1 : calculer le nombre d'événements**  
L'exemple montre comment calculer le nombre d'événements dans les comptes.

```
os> source=accounts | stats count();
fetched rows / total rows = 1/1
+-----------+
| count()   |
|-----------|
| 4         |
+-----------+
```

**Exemple 2 : calculer la moyenne d'un champ**  
L'exemple montre comment calculer l'âge moyen de tous les comptes.

```
os> source=accounts | stats avg(age);
fetched rows / total rows = 1/1
+------------+
| avg(age)   |
|------------|
| 32.25      |
+------------+
```

**Exemple 3 : calculer la moyenne d'un champ par groupe**  
L'exemple montre comment calculer l'âge moyen de tous les comptes, regroupés par sexe.

```
os> source=accounts | stats avg(age) by gender;
fetched rows / total rows = 2/2
+--------------------+----------+
| avg(age)           | gender   |
|--------------------+----------|
| 28.0               | F        |
| 33.666666666666664 | M        |
+--------------------+----------+
```

**Exemple 4 : calculer la moyenne, la somme et le nombre d'un champ par groupe**  
L'exemple montre comment calculer l'âge moyen, l'âge total et le nombre d'événements pour tous les comptes, regroupés par sexe.

```
os> source=accounts | stats avg(age), sum(age), count() by gender;
fetched rows / total rows = 2/2
+--------------------+------------+-----------+----------+
| avg(age)           | sum(age)   | count()   | gender   |
|--------------------+------------+-----------+----------|
| 28.0               | 28         | 1         | F        |
| 33.666666666666664 | 101        | 3         | M        |
+--------------------+------------+-----------+----------+
```

**Exemple 5 : Calculer le maximum d'un champ**  
L'exemple calcule l'âge maximum pour tous les comptes.

```
os> source=accounts | stats max(age);
fetched rows / total rows = 1/1
+------------+
| max(age)   |
|------------|
| 36         |
+------------+
```

**Exemple 6 : Calculer le maximum et le minimum d'un champ par groupe**  
L'exemple calcule les valeurs d'âge maximum et minimum pour tous les comptes, regroupés par sexe.

```
os> source=accounts | stats max(age), min(age) by gender;
fetched rows / total rows = 2/2
+------------+------------+----------+
| max(age)   | min(age)   | gender   |
|------------+------------+----------|
| 28         | 28         | F        |
| 36         | 32         | M        |
+------------+------------+----------+
```

**Exemple 7 : Calculer le nombre distinct d'un champ**  
Pour obtenir le nombre de valeurs distinctes d'un champ, vous pouvez utiliser la fonction `DISTINCT_COUNT` (ou`DC`) au lieu de`COUNT`. L'exemple calcule à la fois le nombre et le nombre distinct de champs de genre de tous les comptes.

```
os> source=accounts | stats count(gender), distinct_count(gender);
fetched rows / total rows = 1/1
+-----------------+--------------------------+
| count(gender)   | distinct_count(gender)   |
|-----------------+--------------------------|
| 4               | 2                        |
+-----------------+--------------------------+
```

**Exemple 8 : Calculer le nombre par intervalle**  
L'exemple obtient le décompte de l'âge par intervalle de 10 ans.

```
os> source=accounts | stats count(age) by span(age, 10) as age_span
fetched rows / total rows = 2/2
+--------------+------------+
| count(age)   | age_span   |
|--------------+------------|
| 1            | 20         |
| 3            | 30         |
+--------------+------------+
```

**Exemple 9 : Calculez le nombre par sexe et par intervalle**  
Cet exemple compte les enregistrements regroupés par sexe et par tranche d'âge de 5 ans.

```
os> source=accounts | stats count() as cnt by span(age, 5) as age_span, gender
fetched rows / total rows = 3/3
+-------+------------+----------+
| cnt   | age_span   | gender   |
|-------+------------+----------|
| 1     | 25         | F        |
| 2     | 30         | M        |
| 1     | 35         | M        |
+-------+------------+----------+
```

L'expression span apparaît toujours comme première clé de regroupement, quel que soit l'ordre spécifié dans la commande.

```
os> source=accounts | stats count() as cnt by gender, span(age, 5) as age_span
fetched rows / total rows = 3/3
+-------+------------+----------+
| cnt   | age_span   | gender   |
|-------+------------+----------|
| 1     | 25         | F        |
| 2     | 30         | M        |
| 1     | 35         | M        |
+-------+------------+----------+
```

**Exemple 10 : Calculez le nombre et obtenez une liste d'e-mails par sexe et par durée**  
L'exemple obtient le décompte de l'âge par intervalle de 10 ans et le groupe par sexe. De plus, pour chaque ligne, obtenez une liste d'au plus 5 e-mails.

```
os> source=accounts | stats count() as cnt, take(email, 5) by span(age, 5) as age_span, gender
fetched rows / total rows = 3/3
+-------+----------------------------------------------------+------------+----------+
| cnt   | take(email, 5)                                     | age_span   | gender   |
|-------+----------------------------------------------------+------------+----------|
| 1     | []                                                 | 25         | F        |
| 2     | [janedoe@anycompany.com,juanli@examplecompany.org] | 30         | M        |
| 1     | [marymajor@examplecorp.com]                        | 35         | M        |
+-------+----------------------------------------------------+------------+----------+
```

**Exemple 11 : Calculer le percentile d'un champ**  
L'exemple montre comment calculer le 90e percentile d'âge de tous les comptes.

```
os> source=accounts | stats percentile(age, 90);
fetched rows / total rows = 1/1
+-----------------------+
| percentile(age, 90)   |
|-----------------------|
| 36                    |
+-----------------------+
```

**Exemple 12 : Calculer le percentile d'un champ par groupe**  
L'exemple montre comment calculer le 90e percentile d'âge de tous les comptes regroupés par sexe.

```
os> source=accounts | stats percentile(age, 90) by gender;
fetched rows / total rows = 2/2
+-----------------------+----------+
| percentile(age, 90)   | gender   |
|-----------------------+----------|
| 28                    | F        |
| 36                    | M        |
+-----------------------+----------+
```

**Exemple 13 : Calculer le percentile en fonction du sexe et de l'intervalle**  
L'exemple obtient le 90e percentile d'âge par intervalle de 10 ans et le groupe par sexe.

```
os> source=accounts | stats percentile(age, 90) as p90 by span(age, 10) as age_span, gender
fetched rows / total rows = 2/2
+-------+------------+----------+
| p90   | age_span   | gender   |
|-------+------------+----------|
| 28    | 20         | F        |
| 36    | 30         | M        |
+-------+------------+----------+
```

```
- `source = table | stats avg(a) `
- `source = table | where a < 50 | stats avg(c) `
- `source = table | stats max(c) by b`
- `source = table | stats count(c) by b | head 5`
- `source = table | stats distinct_count(c)`
- `source = table | stats stddev_samp(c)`
- `source = table | stats stddev_pop(c)`
- `source = table | stats percentile(c, 90)`
- `source = table | stats percentile_approx(c, 99)`
```

**Agrégations avec span**  


```
- `source = table  | stats count(a) by span(a, 10) as a_span`
- `source = table  | stats sum(age) by span(age, 5) as age_span | head 2`
- `source = table  | stats avg(age) by span(age, 20) as age_span, country  | sort - age_span |  head 2`
```

**Agrégations avec intervalle de fenêtre temporelle (fonction de fenêtrage Tumble)**  


```
- `source = table | stats sum(productsAmount) by span(transactionDate, 1d) as age_date | sort age_date`
- `source = table | stats sum(productsAmount) by span(transactionDate, 1w) as age_date, productId`
```

**Les agrégations sont regroupées par plusieurs niveaux**  


```
- `source = table | stats avg(age) as avg_state_age by country, state | stats avg(avg_state_age) as avg_country_age by country`
- `source = table | stats avg(age) as avg_city_age by country, state, city | eval new_avg_city_age = avg_city_age - 1 | stats avg(new_avg_city_age) as avg_state_age by country, state | where avg_state_age > 18 | stats avg(avg_state_age) as avg_adult_country_age by country`
```

#### commande de sous-requête
<a name="supported-ppl-subquery-commands"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `subquery` commande pour exécuter des requêtes complexes et imbriquées dans vos instructions PPL (Piped Processing Language).

```
source=logs | where field in [ subquery source=events | where condition | fields field ]
```

Dans cet exemple, la recherche principale (`source=logs`) est filtrée en fonction des résultats de la sous-requête (`source=events`).

La commande subquery prend en charge plusieurs niveaux d'imbrication pour des analyses de données complexes.

**Exemple de sous-requête imbriquée**  


```
source=logs | where id in [ subquery source=users | where user in [ subquery source=actions | where action="login" | fields user] | fields uid ]  
```

**InSubquery Usage**
+ `source = outer | where a in [ source = inner | fields b ]`
+ `source = outer | where (a) in [ source = inner | fields b ]`
+ `source = outer | where (a,b,c) in [ source = inner | fields d,e,f ]`
+ `source = outer | where a not in [ source = inner | fields b ]`
+ `source = outer | where (a) not in [ source = inner | fields b ]`
+ `source = outer | where (a,b,c) not in [ source = inner | fields d,e,f ]`
+ `source = outer a in [ source = inner | fields b ]`(filtrage de recherche avec sous-requête)
+ `source = outer a not in [ source = inner | fields b ]`(filtrage de recherche avec sous-requête)
+ `source = outer | where a in [ source = inner1 | where b not in [ source = inner2 | fields c ] | fields b ]`(imbriqué)
+ `source = table1 | inner join left = l right = r on l.a = r.a AND r.a in [ source = inner | fields d ] | fields l.a, r.a, b, c`(en tant que filtre de jointure)

**Exemples de migration SQL avec PPL dans la sous-requête**  
TPC-H Q4 (sous-requête intégrée avec agrégation)

```
select
  o_orderpriority,
  count(*) as order_count
from
  orders
where
  o_orderdate >= date '1993-07-01'
  and o_orderdate < date '1993-07-01' + interval '3' month
  and o_orderkey in (
    select
      l_orderkey
    from
      lineitem
    where l_commitdate < l_receiptdate
  )
group by
  o_orderpriority
order by
  o_orderpriority
```

Réécrit par requête PPL InSubquery  :

```
source = orders
| where o_orderdate >= "1993-07-01" and o_orderdate < "1993-10-01" and o_orderkey IN
  [ source = lineitem
    | where l_commitdate < l_receiptdate
    | fields l_orderkey
  ]
| stats count(1) as order_count by o_orderpriority
| sort o_orderpriority
| fields o_orderpriority, order_count
```

TPC-H Q20 (sous-requête imbriquée)

```
select
  s_name,
  s_address
from
  supplier,
  nation
where
  s_suppkey in (
    select
      ps_suppkey
    from
      partsupp
    where
      ps_partkey in (
        select
          p_partkey
        from
          part
        where
          p_name like 'forest%'
      )
  )
  and s_nationkey = n_nationkey
  and n_name = 'CANADA'
order by
  s_name
```

Réécrit par requête PPL InSubquery  :

```
source = supplier
| where s_suppkey IN [
    source = partsupp
    | where ps_partkey IN [
        source = part
        | where like(p_name, "forest%")
        | fields p_partkey
      ]
    | fields ps_suppkey
  ]
| inner join left=l right=r on s_nationkey = n_nationkey and n_name = 'CANADA'
  nation
| sort s_name
```

**ExistsSubquery utilisation**  
Hypothèses :`a`, `b` sont des champs de table externe`c`,, `d` sont des champs de table interne`e`, `f` sont des champs de table inner2.
+ `source = outer | where exists [ source = inner | where a = c ]`
+ `source = outer | where not exists [ source = inner | where a = c ]`
+ `source = outer | where exists [ source = inner | where a = c and b = d ]`
+ `source = outer | where not exists [ source = inner | where a = c and b = d ]`
+ `source = outer exists [ source = inner | where a = c ]`(filtrage de recherche avec sous-requête)
+ `source = outer not exists [ source = inner | where a = c ]`(filtrage de recherche avec sous-requête)
+ `source = table as t1 exists [ source = table as t2 | where t1.a = t2.a ]`(l'alias de table est utile dans la sous-requête exists)
+ `source = outer | where exists [ source = inner1 | where a = c and exists [ source = inner2 | where c = e ] ]`(imbriqué)
+ `source = outer | where exists [ source = inner1 | where a = c | where exists [ source = inner2 | where c = e ] ]`(imbriqué)
+ `source = outer | where exists [ source = inner | where c > 10 ]`(il existe une corrélation non corrélée)
+ `source = outer | where not exists [ source = inner | where c > 10 ]`(il existe une corrélation non corrélée)
+ `source = outer | where exists [ source = inner ] | eval l = "nonEmpty" | fields l`(il existe une corrélation spéciale non corrélée)

**ScalarSubquery utilisation**  
Hypothèses :`a`, `b` les champs de la table sont-ils extérieurs`c`, `d` sont-ils les champs de la table internes`e`, `f` sont-ils des champs de la table imbriqués

**Sous-requête scalaire non corrélée**  
Dans Select :
+ `source = outer | eval m = [ source = inner | stats max(c) ] | fields m, a`
+ `source = outer | eval m = [ source = inner | stats max(c) ] + b | fields m, a`

Où :
+ `source = outer | where a > [ source = inner | stats min(c) ] | fields a`

Dans le filtre de recherche :
+ `source = outer a > [ source = inner | stats min(c) ] | fields a`

**Sous-requête scalaire corrélée**  
Dans Select :
+ `source = outer | eval m = [ source = inner | where outer.b = inner.d | stats max(c) ] | fields m, a`
+ `source = outer | eval m = [ source = inner | where b = d | stats max(c) ] | fields m, a`
+ `source = outer | eval m = [ source = inner | where outer.b > inner.d | stats max(c) ] | fields m, a`

Où :
+ `source = outer | where a = [ source = inner | where outer.b = inner.d | stats max(c) ]`
+ `source = outer | where a = [ source = inner | where b = d | stats max(c) ]`
+ `source = outer | where [ source = inner | where outer.b = inner.d OR inner.d = 1 | stats count() ] > 0 | fields a`

Dans le filtre de recherche :
+ `source = outer a = [ source = inner | where b = d | stats max(c) ]`
+ `source = outer [ source = inner | where outer.b = inner.d OR inner.d = 1 | stats count() ] > 0 | fields a`

**Sous-requête scalaire imbriquée**  

+ `source = outer | where a = [ source = inner | stats max(c) | sort c ] OR b = [ source = inner | where c = 1 | stats min(d) | sort d ]`
+ `source = outer | where a = [ source = inner | where c = [ source = nested | stats max(e) by f | sort f ] | stats max(d) by c | sort c | head 1 ]`

**Sous-requête (Relation)**  
`InSubquery`, `ExistsSubquery` et `ScalarSubquery` sont toutes des expressions de sous-requêtes. Mais ce n'`RelationSubquery`est pas une expression de sous-requête, c'est un plan de sous-requête couramment utilisé dans les clauses Join ou From.
+ `source = table1 | join left = l right = r [ source = table2 | where d > 10 | head 5 ]`(sous-requête dans le côté droit de la jointure)
+ `source = [ source = table1 | join left = l right = r [ source = table2 | where d > 10 | head 5 ] | stats count(a) by b ] as outer | head 1`

**Contexte supplémentaire**  
`InSubquery``ExistsSubquery`, et `ScalarSubquery` sont des expressions de sous-requêtes couramment utilisées dans les `where` clauses et les filtres de recherche.

Commande où :

```
| where <boolean expression> | ...    
```

Filtre de recherche :

```
search source=* <boolean expression> | ...    
```

Une expression de sous-requête peut être utilisée dans une expression booléenne :

```
| where orders.order_id in [ source=returns | where return_reason="damaged" | field order_id ]    
```

`orders.order_id in [ source=... ]`C'est un`<boolean expression>`.

En général, nous appelons ce type de clause de sous-requête l'`InSubquery`expression. C'est un`<boolean expression>`.

**Sous-requête avec différents types de jointure**  
Exemple d’utilisation de `ScalarSubquery` :

```
source=employees
| join source=sales on employees.employee_id = sales.employee_id
| where sales.sale_amount > [ source=targets | where target_met="true" | fields target_value ]
```

Contrairement à InSubquery ExistsSubquery, et ScalarSubquery, a n' RelationSubqueryest pas une expression de sous-requête. Il s'agit plutôt d'un plan de sous-requête.

```
SEARCH source=customer
| FIELDS c_custkey
| LEFT OUTER JOIN left = c, right = o ON c.c_custkey = o.o_custkey
   [
      SEARCH source=orders
      | WHERE o_comment NOT LIKE '%unusual%packages%'
      | FIELDS o_orderkey, o_custkey
   ]
| STATS ...
```

#### commande supérieure
<a name="supported-ppl-top-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `top` commande pour rechercher le tuple de valeurs le plus courant de tous les champs de la liste de champs.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
top [N] <field-list> [by-clause] top_approx [N] <field-list> [by-clause]
```

**N**
+ Le nombre de résultats à renvoyer. 
+ Par défaut: 10

**liste de champs**
+ Obligatoire. 
+ Liste de noms de champs séparés par des virgules.

**clause**
+ Facultatif. 
+ Un ou plusieurs champs par lesquels regrouper les résultats.

**top\$1approx**
+ Un décompte approximatif des (n) premiers champs en utilisant la [cardinalité estimée par l'algorithme HyperLogLog \$1\$1](https://spark.apache.org/docs/latest/sql-ref-functions-builtin.html).

**Exemple 1 : trouver les valeurs les plus courantes dans un champ**  
L'exemple permet de trouver le sexe le plus courant pour tous les comptes.

Requête PPL :

```
os> source=accounts | top gender;
os> source=accounts | top_approx gender;
fetched rows / total rows = 2/2
+----------+
| gender   |
|----------|
| M        |
| F        |
+----------+
```

**Exemple 2 : Rechercher les valeurs les plus courantes dans un champ (limité à 1)**  
L'exemple permet de trouver le sexe le plus courant pour tous les comptes.

Requête PPL :

```
os> source=accounts | top_approx 1 gender;
fetched rows / total rows = 1/1
+----------+
| gender   |
|----------|
| M        |
+----------+
```

**Exemple 3 : trouver les valeurs les plus courantes, groupées par sexe**  
L'exemple permet de trouver l'âge le plus courant pour tous les comptes, groupés par sexe.

Requête PPL :

```
os> source=accounts | top 1 age by gender;
os> source=accounts | top_approx 1 age by gender;
fetched rows / total rows = 2/2
+----------+-------+
| gender   | age   |
|----------+-------|
| F        | 28    |
| M        | 32    |
+----------+-------+
```

#### commande trendline
<a name="supported-ppl-trendline-commands"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `trendline` commande pour calculer les moyennes mobiles des champs.

**Syntaxe**  
Utilisez la syntaxe suivante

```
TRENDLINE [sort <[+|-] sort-field>] SMA(number-of-datapoints, field) [AS alias] [SMA(number-of-datapoints, field) [AS alias]]... 
```

**[\$1\$1-]**
+ Facultatif. 
+ Le signe plus [\$1] représente l'ordre croissant avec NULL/MISSING les valeurs en premier.
+ Le signe moins [-] représente l'ordre décroissant avec NULL/MISSING les dernières valeurs. 
+ Par défaut : ordre croissant avec NULL/MISSING les valeurs en premier.

**champ de tri**
+ Obligatoire lorsque le tri est utilisé. 
+ Champ utilisé pour le tri.

**number-of-datapoints**
+ Obligatoire. 
+ Le nombre de points de données qui calculent la moyenne mobile.
+ Doit être supérieur à zéro.

**field**
+ Obligatoire. 
+ Nom du champ pour lequel la moyenne mobile doit être calculée.

**alias**
+ Facultatif. 
+ Nom de la colonne résultante contenant la moyenne mobile.

Seul le type de moyenne mobile simple (SMA) est pris en charge. Il est calculé comme suit :

```
f[i]: The value of field 'f' in the i-th data-point
n: The number of data-points in the moving window (period)
t: The current time index

SMA(t) = (1/n) * Σ(f[i]), where i = t-n+1 to t
```

**Exemple 1 : Calculer une moyenne mobile simple pour une série chronologique de températures**  
L'exemple calcule la moyenne mobile simple sur les températures à l'aide de deux points de données.

Requête PPL :

```
os> source=t | trendline sma(2, temperature) as temp_trend;
fetched rows / total rows = 5/5
+-----------+---------+--------------------+----------+
|temperature|device-id|           timestamp|temp_trend|
+-----------+---------+--------------------+----------+
|         12|     1492|2023-04-06 17:07:...|      NULL|
|         12|     1492|2023-04-06 17:07:...|      12.0|
|         13|      256|2023-04-06 17:07:...|      12.5|
|         14|      257|2023-04-06 17:07:...|      13.5|
|         15|      258|2023-04-06 17:07:...|      14.5|
+-----------+---------+--------------------+----------+
```

**Exemple 2 : calculer des moyennes mobiles simples pour une série chronologique de températures avec tri**  
L'exemple calcule deux moyennes mobiles simples sur les températures à l'aide de deux et trois points de données triés en ordre décroissant par identifiant d'appareil.

Requête PPL :

```
os> source=t | trendline sort - device-id sma(2, temperature) as temp_trend_2 sma(3, temperature) as temp_trend_3;
fetched rows / total rows = 5/5
+-----------+---------+--------------------+------------+------------------+
|temperature|device-id|           timestamp|temp_trend_2|      temp_trend_3|
+-----------+---------+--------------------+------------+------------------+
|         15|      258|2023-04-06 17:07:...|        NULL|              NULL|
|         14|      257|2023-04-06 17:07:...|        14.5|              NULL|
|         13|      256|2023-04-06 17:07:...|        13.5|              14.0|
|         12|     1492|2023-04-06 17:07:...|        12.5|              13.0|
|         12|     1492|2023-04-06 17:07:...|        12.0|12.333333333333334|
+-----------+---------+--------------------+------------+------------------+
```

#### où commande
<a name="supported-ppl-where-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

La `where` commande utilise une expression booléenne pour filtrer le résultat de la recherche. Il ne renvoie le résultat que lorsque l'expression booléenne est évaluée à true.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
where <boolean-expression>    
```

**expression booléenne**
+ Facultatif. 
+ Toute expression pouvant être évaluée à une valeur booléenne.

**Exemple 1 : Filtrer un ensemble de résultats avec condition**  
L'exemple montre comment extraire des documents de l'index des comptes qui répondent à des conditions spécifiques.

Requête PPL :

```
os> source=accounts | where account_number=1 or gender="F" | fields account_number, gender;
fetched rows / total rows = 2/2
+------------------+----------+
| account_number   | gender   |
|------------------+----------|
| 1                | M        |
| 13               | F        |
+------------------+----------+
```

**Exemples supplémentaires**  


**Filtres avec conditions logiques**
+ `source = table | where c = 'test' AND a = 1 | fields a,b,c`
+ `source = table | where c != 'test' OR a > 1 | fields a,b,c | head 1`
+ `source = table | where c = 'test' NOT a > 1 | fields a,b,c`
+ `source = table | where a = 1 | fields a,b,c`
+ `source = table | where a >= 1 | fields a,b,c`
+ `source = table | where a < 1 | fields a,b,c`
+ `source = table | where b != 'test' | fields a,b,c`
+ `source = table | where c = 'test' | fields a,b,c | head 3`
+ `source = table | where ispresent(b)`
+ `source = table | where isnull(coalesce(a, b)) | fields a,b,c | head 3`
+ `source = table | where isempty(a)`
+ `source = table | where isblank(a)`
+ `source = table | where case(length(a) > 6, 'True' else 'False') = 'True'`
+ `source = table | where a between 1 and 4`- Remarque : Cela renvoie a >= 1 et a <= 4, c'est-à-dire [1, 4]
+ `source = table | where b not between '2024-09-10' and '2025-09-10'`- Remarque : cela renvoie b >= '\$1\$1\$1\$1\$1\$1\$1\$1\$1\$1' et b <= '2025-09-10'
+ `source = table | where cidrmatch(ip, '***********/24')`
+ `source = table | where cidrmatch(ipv6, '2003:db8::/32')`

```
source = table | eval status_category =
    case(a >= 200 AND a < 300, 'Success',
    a >= 300 AND a < 400, 'Redirection',
    a >= 400 AND a < 500, 'Client Error',
    a >= 500, 'Server Error'
    else 'Incorrect HTTP status code')
    | where case(a >= 200 AND a < 300, 'Success',
    a >= 300 AND a < 400, 'Redirection',
    a >= 400 AND a < 500, 'Client Error',
    a >= 500, 'Server Error'
    else 'Incorrect HTTP status code'
    ) = 'Incorrect HTTP status code'
```

```
source = table
    | eval factor = case(a > 15, a - 14, isnull(b), a - 7, a < 3, a + 1 else 1)
    | where case(factor = 2, 'even', factor = 4, 'even', factor = 6, 'even', factor = 8, 'even' else 'odd') = 'even'
    |  stats count() by factor
```

#### résumé du champ
<a name="supported-ppl-field-summary-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette commande PPL, consultez. [Commandes](#supported-ppl-commands)

Utilisez la `fieldsummary` commande pour calculer les statistiques de base pour chaque champ (nombre, nombre distinct, min, max, avg, stddev, moyenne) et déterminez le type de données de chaque champ. Cette commande peut être utilisée avec n'importe quel canal précédent et en tiendra compte.

**Syntaxe**  
Utilisez la syntaxe suivante. Pour les cas d'utilisation des CloudWatch journaux, un seul champ d'une requête est pris en charge.

```
... | fieldsummary <field-list> (nulls=true/false)
```

**inclure des champs**
+ Liste de toutes les colonnes à collecter avec des statistiques dans un ensemble de résultats unifié.

**Valeurs null**
+ Facultatif. 
+  Si ce paramètre est défini sur true, incluez les valeurs nulles dans les calculs d'agrégation (remplacez null par zéro pour les valeurs numériques).

**Exemple 1**  
Requête PPL :

```
os> source = t | where status_code != 200 | fieldsummary includefields= status_code nulls=true
+------------------+-------------+------------+------------+------------+------------+------------+------------+----------------|
| Fields           | COUNT       | COUNT_DISTINCT    |  MIN  |  MAX   |  AVG   |  MEAN   |        STDDEV       | NUlls | TYPEOF |
|------------------+-------------+------------+------------+------------+------------+------------+------------+----------------|
| "status_code"    |      2      |         2         | 301   |   403  |  352.0 |  352.0  |  72.12489168102785  |  0    | "int"  |
+------------------+-------------+------------+------------+------------+------------+------------+------------+----------------|
```

**Exemple 2**  
Requête PPL :

```
os> source = t | fieldsummary includefields= id, status_code, request_path nulls=true
+------------------+-------------+------------+------------+------------+------------+------------+------------+----------------|
| Fields           | COUNT       | COUNT_DISTINCT    |  MIN  |  MAX   |  AVG   |  MEAN   |        STDDEV       | NUlls | TYPEOF |
|------------------+-------------+------------+------------+------------+------------+------------+------------+----------------|
|       "id"       |      6      |         6         | 1     |   6    |  3.5   |   3.5  |  1.8708286933869707  |  0    | "int"  |
+------------------+-------------+------------+------------+------------+------------+------------+------------+----------------|
| "status_code"    |      4      |         3         | 200   |   403  |  184.0 |  184.0  |  161.16699413961905 |  2    | "int"  |
+------------------+-------------+------------+------------+------------+------------+------------+------------+----------------|
| "request_path"   |      2      |         2         | /about| /home  |  0.0    |  0.0     |      0            |  2    |"string"|
+------------------+-------------+------------+------------+------------+------------+------------+------------+----------------|
```

#### commande d'extension
<a name="supported-ppl-expand-command"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

Utilisez la `expand` commande pour aplatir un champ de type Array <Any>ou Map<Any>, en produisant des lignes individuelles pour chaque élément ou paire clé-valeur.

**Syntaxe**  
Utilisez la syntaxe suivante :

```
expand <field> [As alias]
```

**field**
+ Le champ à étendre (exploser). 
+ Le champ doit être d'un type compatible.

**alias**
+ Facultatif.
+ Le nom à utiliser à la place du nom de champ d'origine.

**Directives d’utilisation**  
La commande expand produit une ligne pour chaque élément du tableau ou du champ de carte spécifié, où :
+ Les éléments du tableau deviennent des lignes individuelles. 
+ Les paires clé-valeur de la carte sont divisées en lignes distinctes, chaque valeur-clé étant représentée par une ligne. 
+ Lorsqu'un alias est fourni, les valeurs éclatées sont représentées sous l'alias au lieu du nom du champ d'origine. 

Vous pouvez utiliser cette commande en combinaison avec d'autres commandes, telles que stats, eval et parse, pour manipuler ou extraire des données après l'expansion.

**Exemples**
+ `source = table | expand employee | stats max(salary) as max by state, company `
+ `source = table | expand employee as worker | stats max(salary) as max by state, company `
+ `source = table | expand employee as worker | eval bonus = salary * 3 | fields worker, bonus` 
+ `source = table | expand employee | parse description '(?<email>.+@.+)' | fields employee, email` 
+ `source = table | eval array=json_array(1, 2, 3) | expand array as uid | fields name, occupation, uid `
+ `source = table | expand multi_valueA as multiA | expand multi_valueB as multiB` 

Vous pouvez utiliser la commande expand en combinaison avec d'autres commandes telles que eval, stats, etc. L'utilisation de plusieurs commandes d'extension créera un produit cartésien de tous les éléments internes de chaque tableau composite ou carte.

**Requête SQL push-down efficace**  
La commande expand est traduite en une opération SQL équivalente à l'aide de LATERAL VIEW explode, ce qui permet une explosion efficace de tableaux ou de cartes au niveau de la requête SQL.

```
SELECT customer exploded_productId
FROM table
LATERAL VIEW explode(productId) AS exploded_productId
```

La commande explode offre les fonctionnalités suivantes : 
+ Il s'agit d'une opération de colonne qui renvoie une nouvelle colonne. 
+ Il crée une nouvelle ligne pour chaque élément de la colonne éclatée. 
+ Les valeurs nulles internes sont ignorées dans le cadre du champ éclaté (aucune ligne ne correspond created/exploded à une valeur nulle).

#### Fonctions PPL
<a name="supported-ppl-functions-details"></a>

**Topics**
+ [Fonctions de condition PPL](#supported-ppl-condition-functions)
+ [Fonctions de hachage cryptographiques PPL](#supported-ppl-cryptographic-functions)
+ [Fonctions de date et d'heure PPL](#supported-ppl-date-time-functions)
+ [Expressions PPL](#supported-ppl-expressions)
+ [Fonctions d'adresse IP PPL](#supported-ppl-ip-address-functions)
+ [Fonctions JSON PPL](#supported-ppl-json-functions)
+ [Fonctions Lambda PPL](#supported-ppl-lambda-functions)
+ [Fonctions mathématiques PPL](#supported-ppl-math-functions)
+ [Fonctions de chaîne PPL](#supported-ppl-string-functions)
+ [Fonctions de conversion de type PPL](#supported-ppl-type-conversion-functions)

##### Fonctions de condition PPL
<a name="supported-ppl-condition-functions"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

##### ISNULL
<a name="supported-ppl-condition-functions-isnull"></a>

**Description** : `isnull(field)` renvoie vrai si le champ est nul.

**Type d'argument :**
+ Tous les types de données pris en charge.

**Type de retour :**
+ BOOLEAN

**Exemple :**

```
os> source=accounts | eval result = isnull(employer) | fields result, employer, firstname
fetched rows / total rows = 4/4
+----------+-------------+-------------+
| result   | employer    | firstname   |
|----------+-------------+-------------|
| False    | AnyCompany  | Mary        |
| False    | ExampleCorp | Jane        |
| False    | ExampleOrg  | Nikki       |
| True     | null        | Juan        |
+----------+-------------+-------------+
```

##### N'EST PAS NUL
<a name="supported-ppl-condition-functions-isnotnull"></a>

**Description** : `isnotnull(field)` renvoie vrai si le champ n'est pas nul.

**Type d'argument :**
+ Tous les types de données pris en charge.

**Type de retour :**
+ BOOLEAN

**Exemple :**

```
os> source=accounts | where not isnotnull(employer) | fields account_number, employer
fetched rows / total rows = 1/1
+------------------+------------+
| account_number   | employer   |
|------------------+------------|
| 18               | null       |
+------------------+------------+
```

##### EXISTS
<a name="supported-ppl-condition-functions-exists"></a>

**Exemple :**

```
os> source=accounts | where exists(email) | fields account_number, email
fetched rows / total rows = 1/1
```

##### SI NUL
<a name="supported-ppl-condition-functions-ifnull"></a>

**Description** : `ifnull(field1, field2)` renvoie `field2` si la valeur `field1` est nulle.

**Type d'argument :**
+ Tous les types de données pris en charge. 
+ Si les deux paramètres sont de types différents, la fonction échouera à la vérification sémantique.

**Type de retour :**
+ N’importe lequel

**Exemple :**

```
os> source=accounts | eval result = ifnull(employer, 'default') | fields result, employer, firstname
fetched rows / total rows = 4/4
+------------+------------+-------------+
| result     | employer   | firstname   |
|------------+------------+-------------|
| AnyCompany | AnyCompany | Mary        |
| ExampleCorp| ExampleCorp| Jane        |
| ExampleOrg | ExampleOrg | Nikki       |
| default    | null       | Juan        |
+------------+------------+-------------+
```

##### NULLIF
<a name="supported-ppl-condition-functions-nullif"></a>

**Description** : `nullif(field1, field2)` renvoie null si deux paramètres sont identiques, sinon renvoie field1.

**Type d'argument :**
+ Tous les types de données pris en charge. 
+ Si les deux paramètres sont de types différents, la fonction échouera à la vérification sémantique.

**Type de retour :**
+ N’importe lequel

**Exemple :**

```
os> source=accounts | eval result = nullif(employer, 'AnyCompany') | fields result, employer, firstname
fetched rows / total rows = 4/4
+----------------+----------------+-------------+
| result         | employer       | firstname   |
|----------------+----------------+-------------|
| null           | AnyCompany     | Mary        |
| ExampleCorp    | ExampleCorp    | Jane        |
| ExampleOrg     | ExampleOrg     | Nikki       |
| null           | null           | Juan        |
+----------------+----------------+-------------+
```

##### IF
<a name="supported-ppl-condition-functions-if"></a>

**Description** : `if(condition, expr1, expr2)` renvoie `expr1` si la condition est vraie, sinon elle est renvoyée`expr2`.

**Type d'argument :**
+ Tous les types de données pris en charge. 
+ Si les deux paramètres sont de types différents, la fonction échouera à la vérification sémantique.

**Type de retour :**
+ N’importe lequel

**Exemple :**

```
os> source=accounts | eval result = if(true, firstname, lastname) | fields result, firstname, lastname
fetched rows / total rows = 4/4
+----------+-------------+----------+
| result   | firstname | lastname   |
|----------+-------------+----------|
| Jane     | Jane      | Doe        |
| Mary     | Mary      | Major      |
| Pat      | Pat       | Candella   |
| Dale     | Jorge     | Souza      |
+----------+-----------+------------+

os> source=accounts | eval result = if(false, firstname, lastname) | fields result, firstname, lastname
fetched rows / total rows = 4/4
+----------+-------------+------------+
| result   | firstname   | lastname   |
|----------+-------------+------------|
| Doe      | Jane        | Doe        |
| Major    | Mary        | Major      |
| Candella | Pat         | Candella   |
| Souza    | Jorge       | Souza      |
+----------+-------------+------------+

os> source=accounts | eval is_vip = if(age > 30 AND isnotnull(employer), true, false) | fields is_vip, firstname, lastname
fetched rows / total rows = 4/4
+----------+-------------+------------+
| is_vip   | firstname   | lastname   |
|----------+-------------+------------|
| True     | Jane        | Doe        |
| True     | Mary        | Major      |
| False    | Pat         | Candella   |
| False    | Jorge       | Souza      |
+----------+-------------+------------+
```

##### Fonctions de hachage cryptographiques PPL
<a name="supported-ppl-cryptographic-functions"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

##### MD5
<a name="supported-ppl-cryptographic-functions-md5"></a>

MD5 calcule le MD5 résumé et renvoie la valeur sous forme de chaîne hexadécimale de 32 caractères.

**Utilisation** : `md5('hello')`

**Type d'argument :**
+ CHAÎNE

**Type de retour :**
+ CHAÎNE

**Exemple :**

```
os> source=people | eval `MD5('hello')` = MD5('hello') | fields `MD5('hello')`
fetched rows / total rows = 1/1
+----------------------------------+
| MD5('hello')                     |
|----------------------------------|
| <32 character hex string>        |
+----------------------------------+
```

##### SHA1
<a name="supported-ppl-cryptographic-functions-sha1"></a>

SHA1 renvoie le résultat de la chaîne hexadécimale de SHA-1.

**Utilisation** : `sha1('hello')`

**Type d'argument :**
+ CHAÎNE

**Type de retour :**
+ CHAÎNE

**Exemple :**

```
os> source=people | eval `SHA1('hello')` = SHA1('hello') | fields `SHA1('hello')`
fetched rows / total rows = 1/1
+------------------------------------------+
| SHA1('hello')                            |
|------------------------------------------|
| <40-character SHA-1 hash result>         |
+------------------------------------------+
```

##### SHA2
<a name="supported-ppl-cryptographic-functions-sha2"></a>

SHA2 renvoie le résultat sous forme de chaîne hexadécimale de la famille de fonctions de hachage SHA-2 (SHA-224, SHA-256, SHA-384 et SHA-512). Le NumBits indique la longueur de bit souhaitée du résultat, qui doit avoir une valeur de 224, 256, 384, 512

**Utilisation :**
+ `sha2('hello',256)`
+ `sha2('hello',512)`

**Type d'argument :**
+ CHAÎNE, ENTIER

**Type de retour :**
+ CHAÎNE

**Exemple :**

```
os> source=people | eval `SHA2('hello',256)` = SHA2('hello',256) | fields `SHA2('hello',256)`
fetched rows / total rows = 1/1
+------------------------------------------------------------------+
| SHA2('hello',256)                                                |
|------------------------------------------------------------------|
| <64-character SHA-256 hash result>                               |
+------------------------------------------------------------------+

os> source=people | eval `SHA2('hello',512)` = SHA2('hello',512) | fields `SHA2('hello',512)`
fetched rows / total rows = 1/1
+------------------------------------------------------------------+
| SHA2('hello',512)                                                |                                                                |
|------------------------------------------------------------------|
| <128-character SHA-512 hash result>                              |
+------------------------------------------------------------------+
```

##### Fonctions de date et d'heure PPL
<a name="supported-ppl-date-time-functions"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

##### `DAY`
<a name="supported-ppl-date-time-functions-day"></a>

**Utilisation** : `DAY(date)` extrait le jour du mois pour une date comprise entre 1 et 31.

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** :`DAYOFMONTH`, `DAY_OF_MONTH`

**Exemple :**

```
os> source=people | eval `DAY(DATE('2020-08-26'))` = DAY(DATE('2020-08-26')) | fields `DAY(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+---------------------------+
| DAY(DATE('2020-08-26'))   |
|---------------------------|
| 26                        |
+---------------------------+
```

##### `DAYOFMONTH`
<a name="supported-ppl-date-time-functions-dayofmonth"></a>

**Utilisation** : `DAYOFMONTH(date)` extrait le jour du mois pour une date comprise entre 1 et 31.

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** :`DAY`, `DAY_OF_MONTH`

**Exemple :**

```
os> source=people | eval `DAYOFMONTH(DATE('2020-08-26'))` = DAYOFMONTH(DATE('2020-08-26')) | fields `DAYOFMONTH(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+----------------------------------+
| DAYOFMONTH(DATE('2020-08-26'))   |
|----------------------------------|
| 26                               |
+----------------------------------+
```

##### `DAY_OF_MONTH`
<a name="supported-ppl-date-time-functions-day-of-month"></a>

**Utilisation** : `DAY_OF_MONTH(DATE)` extrait le jour du mois pour une date comprise entre 1 et 31.

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** :`DAY`, `DAYOFMONTH`

**Exemple :**

```
os> source=people | eval `DAY_OF_MONTH(DATE('2020-08-26'))` = DAY_OF_MONTH(DATE('2020-08-26')) | fields `DAY_OF_MONTH(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+------------------------------------+
| DAY_OF_MONTH(DATE('2020-08-26'))   |
|------------------------------------|
| 26                                 |
+------------------------------------+
```

##### `DAYOFWEEK`
<a name="supported-ppl-date-time-functions-dayofweek"></a>

**Utilisation** : `DAYOFWEEK(DATE)` renvoie l'index des jours de la semaine pour une date (1 = dimanche, 2 = lundi,..., 7 = samedi).

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `DAY_OF_WEEK`

**Exemple :**

```
os> source=people | eval `DAYOFWEEK(DATE('2020-08-26'))` = DAYOFWEEK(DATE('2020-08-26')) | fields `DAYOFWEEK(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+---------------------------------+
| DAYOFWEEK(DATE('2020-08-26'))   |
|---------------------------------|
| 4                               |
+---------------------------------+
```

##### `DAY_OF_WEEK`
<a name="supported-ppl-date-time-functions-day-of-week"></a>

**Utilisation** : `DAY_OF_WEEK(DATE)` renvoie l'index des jours de la semaine pour une date (1 = dimanche, 2 = lundi,..., 7 = samedi).

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `DAYOFWEEK`

**Exemple :**

```
os> source=people | eval `DAY_OF_WEEK(DATE('2020-08-26'))` = DAY_OF_WEEK(DATE('2020-08-26')) | fields `DAY_OF_WEEK(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+-----------------------------------+
| DAY_OF_WEEK(DATE('2020-08-26'))   |
|-----------------------------------|
| 4                                 |
+-----------------------------------+
```

##### `DAYOFYEAR`
<a name="supported-ppl-date-time-functions-dayofyear"></a>

**Utilisation** : `DAYOFYEAR(DATE)` renvoie le jour de l'année pour une date comprise entre 1 et 366.

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `DAY_OF_YEAR`

**Exemple :**

```
os> source=people | eval `DAYOFYEAR(DATE('2020-08-26'))` = DAYOFYEAR(DATE('2020-08-26')) | fields `DAYOFYEAR(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+---------------------------------+
| DAYOFYEAR(DATE('2020-08-26'))   |
|---------------------------------|
| 239                             |
+---------------------------------+
```

##### `DAY_OF_YEAR`
<a name="supported-ppl-date-time-functions-day-of-year"></a>

**Utilisation** : `DAY_OF_YEAR(DATE)` renvoie le jour de l'année pour une date comprise entre 1 et 366.

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `DAYOFYEAR`

**Exemple :**

```
os> source=people | eval `DAY_OF_YEAR(DATE('2020-08-26'))` = DAY_OF_YEAR(DATE('2020-08-26')) | fields `DAY_OF_YEAR(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+-----------------------------------+
| DAY_OF_YEAR(DATE('2020-08-26'))   |
|-----------------------------------|
| 239                               |
+-----------------------------------+
```

##### `DAYNAME`
<a name="supported-ppl-date-time-functions-dayname"></a>

**Utilisation** : `DAYNAME(DATE)` renvoie le nom du jour de la semaine pour une date, y compris le lundi, le mardi, le mercredi, le jeudi, le vendredi, le samedi et le dimanche.

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : STRING

**Exemple :**

```
os> source=people | eval `DAYNAME(DATE('2020-08-26'))` = DAYNAME(DATE('2020-08-26')) | fields `DAYNAME(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+-------------------------------+
| DAYNAME(DATE('2020-08-26'))   |
|-------------------------------|
| Wednesday                     |
+-------------------------------+
```

##### `FROM_UNIXTIME`
<a name="supported-ppl-date-time-functions-from-unixtime"></a>

**Utilisation** : `FROM_UNIXTIME` renvoie une représentation de l'argument donné sous forme d'horodatage ou de valeur de chaîne de caractères. Cette fonction effectue une conversion inverse de la `UNIX_TIMESTAMP` fonction. 

Si vous fournissez un deuxième argument, `FROM_UNIXTIME` utilisez-le pour formater le résultat de la même manière que la `DATE_FORMAT` fonction. 

Si l'horodatage se situe en dehors de la plage 1970-01-01 00:00:00 à 30-01-01-18 23:59:59.999 999 (0 à 32536771199.999999 heure d'époque), la fonction revient. `NULL`

**Type d'argument** : DOUBLE, CHAÎNE

**Carte des types de retour** :

DOUBLE -> HORODATAGE

DOUBLE, CHAÎNE -> CHAÎNE

**Exemples :**

```
os> source=people | eval `FROM_UNIXTIME(1220249547)` = FROM_UNIXTIME(1220249547) | fields `FROM_UNIXTIME(1220249547)`
fetched rows / total rows = 1/1
+-----------------------------+
| FROM_UNIXTIME(1220249547)   |
|-----------------------------|
| 2008-09-01 06:12:27         |
+-----------------------------+

os> source=people | eval `FROM_UNIXTIME(1220249547, 'HH:mm:ss')` = FROM_UNIXTIME(1220249547, 'HH:mm:ss') | fields `FROM_UNIXTIME(1220249547, 'HH:mm:ss')`
fetched rows / total rows = 1/1
+-----------------------------------------+
| FROM_UNIXTIME(1220249547, 'HH:mm:ss')   |
|-----------------------------------------|
| 06:12:27                                |
+-----------------------------------------+
```

##### `HOUR`
<a name="supported-ppl-date-time-functions-hour"></a>

**Utilisation** : `HOUR(TIME)` extrait la valeur horaire pour le temps. 

Contrairement à une heure standard, la valeur horaire de cette fonction peut avoir une plage supérieure à 23. Par conséquent, la valeur de retour de `HOUR(TIME)` peut être supérieure à 23.

**Type d'argument** : STRING/TIME/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `HOUR_OF_DAY`

**Exemple :**

```
os> source=people | eval `HOUR(TIME('01:02:03'))` = HOUR(TIME('01:02:03')) | fields `HOUR(TIME('01:02:03'))`
fetched rows / total rows = 1/1
+--------------------------+
| HOUR(TIME('01:02:03'))   |
|--------------------------|
| 1                        |
+--------------------------+
```

##### `HOUR_OF_DAY`
<a name="supported-ppl-date-time-functions-hour-of-day"></a>

**Utilisation** : `HOUR_OF_DAY(TIME)` extrait la valeur de l'heure à partir de l'heure donnée. 

Contrairement à une heure standard, la valeur horaire de cette fonction peut avoir une plage supérieure à 23. Par conséquent, la valeur de retour de `HOUR_OF_DAY(TIME)` peut être supérieure à 23.

**Type d'argument** : STRING/TIME/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `HOUR`

**Exemple :**

```
os> source=people | eval `HOUR_OF_DAY(TIME('01:02:03'))` = HOUR_OF_DAY(TIME('01:02:03')) | fields `HOUR_OF_DAY(TIME('01:02:03'))`
fetched rows / total rows = 1/1
+---------------------------------+
| HOUR_OF_DAY(TIME('01:02:03'))   |
|---------------------------------|
| 1                               |
+---------------------------------+
```

##### `LAST_DAY`
<a name="supported-ppl-date-time-functions-last-day"></a>

**Utilisation** : `LAST_DAY` renvoie le dernier jour du mois sous forme de valeur DATE pour l'argument de date donné.

**Type d'argument** : DATE/STRING/TIMESTAMP/TIME

**Type de retour** : DATE

**Exemple :**

```
os> source=people | eval `last_day('2023-02-06')` = last_day('2023-02-06') | fields `last_day('2023-02-06')`
fetched rows / total rows = 1/1
+--------------------------+
| last_day('2023-02-06')   |
|--------------------------|
| 2023-02-28               |
+--------------------------+
```

##### `LOCALTIMESTAMP`
<a name="supported-ppl-date-time-functions-localtimestamp"></a>

**Utilisation** : `LOCALTIMESTAMP()` est un synonyme de`NOW()`.

**Exemple :**

```
> source=people | eval `LOCALTIMESTAMP()` = LOCALTIMESTAMP() | fields `LOCALTIMESTAMP()`
fetched rows / total rows = 1/1
+---------------------+
| LOCALTIMESTAMP()    |
|---------------------|
| 2022-08-02 15:54:19 |
+---------------------+
```

##### `LOCALTIME`
<a name="supported-ppl-date-time-functions-localtime"></a>

**Usage** : `LOCALTIME()` est un synonyme de`NOW()`.

**Exemple :**

```
> source=people | eval `LOCALTIME()` = LOCALTIME() | fields `LOCALTIME()`
fetched rows / total rows = 1/1
+---------------------+
| LOCALTIME()         |
|---------------------|
| 2022-08-02 15:54:19 |
+---------------------+
```

##### `MAKE_DATE`
<a name="supported-ppl-date-time-functions-make-date"></a>

**Utilisation** : `MAKE_DATE` renvoie une valeur de date basée sur les valeurs d'année, de mois et de jour données. Tous les arguments sont arrondis à des nombres entiers.

**Spécifications** : 1. MAKE\$1DATE (ENTIER, ENTIER, ENTIER) -> DATE

**Type d'argument** : INTEGER, INTEGER, INTEGER

**Type de retour** : DATE

**Exemple :**

```
os> source=people | eval `MAKE_DATE(1945, 5, 9)` = MAKEDATE(1945, 5, 9) | fields `MAKEDATE(1945, 5, 9)`
fetched rows / total rows = 1/1
+------------------------+
| MAKEDATE(1945, 5, 9)   |
|------------------------|
| 1945-05-09             |
+------------------------+
```

##### `MINUTE`
<a name="supported-ppl-date-time-functions-minute"></a>

**Utilisation** : `MINUTE(TIME)` renvoie la composante minute de l'heure donnée, sous la forme d'un entier compris entre 0 et 59.

**Type d'argument** : STRING/TIME/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `MINUTE_OF_HOUR`

**Exemple :**

```
os> source=people | eval `MINUTE(TIME('01:02:03'))` =  MINUTE(TIME('01:02:03')) | fields `MINUTE(TIME('01:02:03'))`
fetched rows / total rows = 1/1
+----------------------------+
| MINUTE(TIME('01:02:03'))   |
|----------------------------|
| 2                          |
+----------------------------+
```

##### `MINUTE_OF_HOUR`
<a name="supported-ppl-date-time-functions-minute-of-hour"></a>

**Utilisation** : `MINUTE_OF_HOUR(TIME)` renvoie la composante minute de l'heure donnée, sous la forme d'un entier compris entre 0 et 59.

**Type d'argument** : STRING/TIME/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `MINUTE`

**Exemple :**

```
os> source=people | eval `MINUTE_OF_HOUR(TIME('01:02:03'))` =  MINUTE_OF_HOUR(TIME('01:02:03')) | fields `MINUTE_OF_HOUR(TIME('01:02:03'))`
fetched rows / total rows = 1/1
+------------------------------------+
| MINUTE_OF_HOUR(TIME('01:02:03'))   |
|------------------------------------|
| 2                                  |
+------------------------------------+
```

##### `MONTH`
<a name="supported-ppl-date-time-functions-month"></a>

**Utilisation** : `MONTH(DATE)` renvoie le mois de la date donnée sous forme de nombre entier, compris entre 1 et 12 (où 1 représente janvier et 12 représente décembre).

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `MONTH_OF_YEAR`

**Exemple :**

```
os> source=people | eval `MONTH(DATE('2020-08-26'))` =  MONTH(DATE('2020-08-26')) | fields `MONTH(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+-----------------------------+
| MONTH(DATE('2020-08-26'))   |
|-----------------------------|
| 8                           |
+-----------------------------+
```

##### `MONTHNAME`
<a name="supported-ppl-date-time-functions-monthname"></a>

**Utilisation** : `MONTHNAME(DATE)` renvoie le mois de la date donnée sous forme de nombre entier, compris entre 1 et 12 (où 1 représente janvier et 12 représente décembre).

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `MONTH_OF_YEAR`

**Exemple :**

```
os> source=people | eval `MONTHNAME(DATE('2020-08-26'))` = MONTHNAME(DATE('2020-08-26')) | fields `MONTHNAME(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+---------------------------------+
| MONTHNAME(DATE('2020-08-26'))   |
|---------------------------------|
| August                          |
+---------------------------------+
```

##### `MONTH_OF_YEAR`
<a name="supported-ppl-date-time-functions-month-of-year"></a>

**Utilisation** : `MONTH_OF_YEAR(DATE)` renvoie le mois de la date donnée sous forme de nombre entier, compris entre 1 et 12 (où 1 représente janvier et 12 représente décembre).

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `MONTH`

**Exemple :**

```
os> source=people | eval `MONTH_OF_YEAR(DATE('2020-08-26'))` =  MONTH_OF_YEAR(DATE('2020-08-26')) | fields `MONTH_OF_YEAR(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+-------------------------------------+
| MONTH_OF_YEAR(DATE('2020-08-26'))   |
|-------------------------------------|
| 8                                   |
+-------------------------------------+
```

##### `NOW`
<a name="supported-ppl-date-time-functions-now"></a>

**Utilisation** : `NOW` renvoie la date et l'heure actuelles sous forme de `TIMESTAMP` valeur au format « YYYY-MM-DD  hh:mm:ss ». La valeur est exprimée dans le fuseau horaire du cluster. 

**Note**  
`NOW()`renvoie un temps constant qui indique le début de l'exécution de l'instruction. Cela diffère de`SYSDATE()`, qui renvoie l'heure exacte de l'exécution.

**Type de retour** : TIMESTAMP

**Spécification** : NOW () -> TIMESTAMP

**Exemple :**

```
os> source=people | eval `value_1` = NOW(), `value_2` = NOW() | fields `value_1`, `value_2`
fetched rows / total rows = 1/1
+---------------------+---------------------+
| value_1             | value_2             |
|---------------------+---------------------|
| 2022-08-02 15:39:05 | 2022-08-02 15:39:05 |
+---------------------+---------------------+
```

##### `QUARTER`
<a name="supported-ppl-date-time-functions-quarter"></a>

**Utilisation** : `QUARTER(DATE)` renvoie le trimestre de l'année pour la date donnée sous forme de nombre entier, compris entre 1 et 4.

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Exemple :**

```
os> source=people | eval `QUARTER(DATE('2020-08-26'))` = QUARTER(DATE('2020-08-26')) | fields `QUARTER(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+-------------------------------+
| QUARTER(DATE('2020-08-26'))   |
|-------------------------------|
| 3                             |
+-------------------------------+
```

##### `SECOND`
<a name="supported-ppl-date-time-functions-second"></a>

**Utilisation** : `SECOND(TIME)` renvoie la deuxième composante du temps donné sous forme d'entier, compris entre 0 et 59.

**Type d'argument** : STRING/TIME/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `SECOND_OF_MINUTE`

**Exemple :**

```
os> source=people | eval `SECOND(TIME('01:02:03'))` = SECOND(TIME('01:02:03')) | fields `SECOND(TIME('01:02:03'))`
fetched rows / total rows = 1/1
+----------------------------+
| SECOND(TIME('01:02:03'))   |
|----------------------------|
| 3                          |
+----------------------------+
```

##### `SECOND_OF_MINUTE`
<a name="supported-ppl-date-time-functions-second-of-minute"></a>

**Utilisation** : `SECOND_OF_MINUTE(TIME)` renvoie la deuxième composante du temps donné sous forme d'entier, compris entre 0 et 59.

**Type d'argument** : STRING/TIME/TIMESTAMP

**Type de retour** : INTEGER

**Synonymes** : `SECOND`

**Exemple :**

```
os> source=people | eval `SECOND_OF_MINUTE(TIME('01:02:03'))` = SECOND_OF_MINUTE(TIME('01:02:03')) | fields `SECOND_OF_MINUTE(TIME('01:02:03'))`
fetched rows / total rows = 1/1
+--------------------------------------+
| SECOND_OF_MINUTE(TIME('01:02:03'))   |
|--------------------------------------|
| 3                                    |
+--------------------------------------+
```

##### `SUBDATE`
<a name="supported-ppl-date-time-functions-subdate"></a>

**Utilisation** : `SUBDATE(DATE, DAYS)` soustrait le deuxième argument (tel que `DATE` ou`DAYS`) de la date donnée.

**Type d'argument** : DATE/TIMESTAMP, LONG

**Carte des types de retour** : (DATE, LONG) -> DATE

**Antonymes** : `ADDDATE`

**Exemple :**

```
os> source=people | eval `'2008-01-02' - 31d` = SUBDATE(DATE('2008-01-02'), 31), `'2020-08-26' - 1` = SUBDATE(DATE('2020-08-26'), 1), `ts '2020-08-26 01:01:01' - 1` = SUBDATE(TIMESTAMP('2020-08-26 01:01:01'), 1) | fields `'2008-01-02' - 31d`, `'2020-08-26' - 1`, `ts '2020-08-26 01:01:01' - 1`
fetched rows / total rows = 1/1
+----------------------+--------------------+--------------------------------+
| '2008-01-02' - 31d   | '2020-08-26' - 1   | ts '2020-08-26 01:01:01' - 1   |
|----------------------+--------------------+--------------------------------|
| 2007-12-02 00:00:00  | 2020-08-25         | 2020-08-25 01:01:01            |
+----------------------+--------------------+--------------------------------+
```

##### `SYSDATE`
<a name="supported-ppl-date-time-functions-sysdate"></a>

**Utilisation** : `SYSDATE()` renvoie la date et l'heure actuelles sous forme de `TIMESTAMP` valeur au format « YYYY-MM-DD  hh:mm:ss.nnnnnn ». 

`SYSDATE()`renvoie l'heure exacte à laquelle il s'exécute. Cela diffère de NOW (), qui renvoie un temps constant indiquant le moment où l'instruction a commencé à s'exécuter. 

**Type d'argument facultatif** : INTEGER (0 à 6) - Spécifie le nombre de chiffres pour les fractions de secondes dans la valeur de retour.

**Type de retour** : TIMESTAMP

**Exemple :**

```
os> source=people | eval `SYSDATE()` = SYSDATE() | fields `SYSDATE()`
fetched rows / total rows = 1/1
+----------------------------+
| SYSDATE()                  |
|----------------------------|
| 2022-08-02 15:39:05.123456 |
+----------------------------+
```

##### `TIMESTAMP`
<a name="supported-ppl-date-time-functions-timestamp"></a>

**Utilisation** : `TIMESTAMP(EXPR)` construit un type d'horodatage avec la chaîne d'entrée `expr` comme horodatage. 

Avec un seul argument, `TIMESTAMP(expr)` construit un horodatage à partir de l'entrée. S'il s'`expr`agit d'une chaîne, elle est interprétée comme un horodatage. Pour les arguments autres que des chaînes, la fonction est convertie `expr` en horodatage en utilisant le fuseau horaire UTC. Quand `expr` est une `TIME` valeur, la fonction applique la date du jour avant le casting.

Lorsqu'il est utilisé avec deux arguments, `TIMESTAMP(expr1, expr2)` ajoute l'expression temporelle (`expr2`) à l'expression de date ou d'horodatage (`expr1`) et renvoie le résultat sous forme de valeur d'horodatage.

**Type d'argument** : STRING/DATE/TIME/TIMESTAMP

**Carte des types de retour** :

(STRING/DATE/TIME/TIMESTAMP) -> HORODATAGE

(STRING/DATE/TIME/TIMESTAMP, STRING/DATE/TIME/TIMESTAMP) -> HORODATAGE

**Exemple :**

```
os> source=people | eval `TIMESTAMP('2020-08-26 13:49:00')` = TIMESTAMP('2020-08-26 13:49:00'), `TIMESTAMP('2020-08-26 13:49:00', TIME('12:15:42'))` = TIMESTAMP('2020-08-26 13:49:00', TIME('12:15:42')) | fields `TIMESTAMP('2020-08-26 13:49:00')`, `TIMESTAMP('2020-08-26 13:49:00', TIME('12:15:42'))`
fetched rows / total rows = 1/1
+------------------------------------+------------------------------------------------------+
| TIMESTAMP('2020-08-26 13:49:00')   | TIMESTAMP('2020-08-26 13:49:00', TIME('12:15:42'))   |
|------------------------------------+------------------------------------------------------|
| 2020-08-26 13:49:00                | 2020-08-27 02:04:42                                  |
+------------------------------------+------------------------------------------------------+
```

##### `UNIX_TIMESTAMP`
<a name="supported-ppl-date-time-functions-unix-timestamp"></a>

**Utilisation** : `UNIX_TIMESTAMP` convertit un argument de date donné en heure Unix (secondes depuis Epoch, qui a débuté début 1970). Si aucun argument n'est fourni, il renvoie l'heure Unix actuelle. 

L'argument date peut être une`DATE`, une `TIMESTAMP` chaîne ou un nombre dans l'un des formats suivants : `YYMMDD``YYMMDDhhmmss`,`YYYYMMDD`, ou`YYYYMMDDhhmmss`. Si l'argument inclut une composante temporelle, il peut éventuellement inclure des fractions de secondes.

Si le format de l'argument n'est pas valide ou s'il se situe en dehors de la plage comprise entre 1970-01-01 00:00:00 et 30-01-01-18 23:59:59.999 999 (0 à 32536771199.999999 en temps d'époque), la fonction revient. `NULL`

La fonction accepte `DATE``TIMESTAMP`, ou `DOUBLE` en tant que types d'arguments, ou aucun argument. Elle renvoie toujours une `DOUBLE` valeur représentant l'horodatage Unix.

Pour la conversion inverse, vous pouvez utiliser la fonction FROM\$1UNIXTIME.

**Type d'argument** :<NONE>/DOUBLE/DATE/TIMESTAMP

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `UNIX_TIMESTAMP(double)` = UNIX_TIMESTAMP(20771122143845), `UNIX_TIMESTAMP(timestamp)` = UNIX_TIMESTAMP(TIMESTAMP('1996-11-15 17:05:42')) | fields `UNIX_TIMESTAMP(double)`, `UNIX_TIMESTAMP(timestamp)`
fetched rows / total rows = 1/1
+--------------------------+-----------------------------+
| UNIX_TIMESTAMP(double)   | UNIX_TIMESTAMP(timestamp)   |
|--------------------------+-----------------------------|
| 3404817525.0             | 848077542.0                 |
+--------------------------+-----------------------------+
```

##### `WEEK`
<a name="supported-ppl-date-time-functions-week"></a>

**Utilisation** : `WEEK(DATE)` renvoie le numéro de semaine pour une date donnée.

**Type d'argument** : DATE/TIMESTAMP/STRING

**Type de retour** : INTEGER

**Synonymes** : `WEEK_OF_YEAR`

**Exemple :**

```
os> source=people | eval `WEEK(DATE('2008-02-20'))` = WEEK(DATE('2008-02-20')) | fields `WEEK(DATE('2008-02-20'))`
fetched rows / total rows = 1/1
+----------------------------+
| WEEK(DATE('2008-02-20'))   |
|----------------------------|
| 8                          |
+----------------------------+
```

##### `WEEKDAY`
<a name="supported-ppl-date-time-functions-weekday"></a>

**Utilisation** : `WEEKDAY(DATE)` renvoie l'index des jours de la semaine pour la date (0 = lundi, 1 = mardi,..., 6 = dimanche).

Elle est similaire à la `dayofweek` fonction, mais renvoie des index différents pour chaque jour.

**Type d'argument** : STRING/DATE/TIME/TIMESTAMP

**Type de retour** : INTEGER

**Exemple :**

```
os> source=people | eval `weekday(DATE('2020-08-26'))` = weekday(DATE('2020-08-26')) | eval `weekday(DATE('2020-08-27'))` = weekday(DATE('2020-08-27')) | fields `weekday(DATE('2020-08-26'))`, `weekday(DATE('2020-08-27'))`
fetched rows / total rows = 1/1
+-------------------------------+-------------------------------+
| weekday(DATE('2020-08-26'))   | weekday(DATE('2020-08-27'))   |
|-------------------------------+-------------------------------|
| 2                             | 3                             |
+-------------------------------+-------------------------------+
```

##### `WEEK_OF_YEAR`
<a name="supported-ppl-date-time-functions-week-of-year"></a>

**Utilisation** : `WEEK_OF_YEAR(DATE)` renvoie le numéro de semaine pour la date donnée.

**Type d'argument** : DATE/TIMESTAMP/STRING

**Type de retour** : INTEGER

**Synonymes** : `WEEK`

**Exemple :**

```
os> source=people | eval `WEEK_OF_YEAR(DATE('2008-02-20'))` = WEEK(DATE('2008-02-20'))| fields `WEEK_OF_YEAR(DATE('2008-02-20'))`
fetched rows / total rows = 1/1
+------------------------------------+
| WEEK_OF_YEAR(DATE('2008-02-20'))   |
|------------------------------------|
| 8                                  |
+------------------------------------+
```

##### `YEAR`
<a name="supported-ppl-date-time-functions-year"></a>

**Utilisation** : `YEAR(DATE)` renvoie l'année pour la date, comprise entre 1000 et 9999, ou 0 pour la date « zéro ».

**Type d'argument** : STRING/DATE/TIMESTAMP

**Type de retour** : INTEGER

**Exemple :**

```
os> source=people | eval `YEAR(DATE('2020-08-26'))` = YEAR(DATE('2020-08-26')) | fields `YEAR(DATE('2020-08-26'))`
fetched rows / total rows = 1/1
+----------------------------+
| YEAR(DATE('2020-08-26'))   |
|----------------------------|
| 2020                       |
+----------------------------+
```

##### `DATE_ADD`
<a name="supported-ppl-date-time-functions-date-add"></a>

**Utilisation** : `DATE_ADD(date, INTERVAL expr unit)` ajoute l'intervalle spécifié à la date donnée.

**Type d'argument** : DATE, INTERVALLE

**Type de retour** : DATE

**Antonymes** : `DATE_SUB`

**Exemple :**

```
os> source=people | eval `'2020-08-26' + 1d` = DATE_ADD(DATE('2020-08-26'), INTERVAL 1 DAY) | fields `'2020-08-26' + 1d`
fetched rows / total rows = 1/1
+---------------------+
| '2020-08-26' + 1d   |
|---------------------|
| 2020-08-27          |
+---------------------+
```

##### `DATE_SUB`
<a name="supported-ppl-date-time-functions-date-sub"></a>

**Utilisation** : `DATE_SUB(date, INTERVAL expr unit)` soustrait l'intervalle expr de la date.

**Type d'argument** : DATE, INTERVALLE

**Type de retour** : DATE

**Antonymes** : `DATE_ADD`

**Exemple :**

```
os> source=people | eval `'2008-01-02' - 31d` = DATE_SUB(DATE('2008-01-02'), INTERVAL 31 DAY) | fields `'2008-01-02' - 31d`
fetched rows / total rows = 1/1
+---------------------+
| '2008-01-02' - 31d  |
|---------------------|
| 2007-12-02          |
+---------------------+
```

##### `TIMESTAMPADD`
<a name="supported-ppl-date-time-functions-timestampadd"></a>

**Utilisation** : renvoie une `TIMESTAMP` valeur après avoir ajouté un intervalle de temps spécifié à une date donnée.

**Arguments :** 
+ intervalle : INTERVALLE (SECONDE, MINUTE, HEURE, JOUR, SEMAINE, MOIS, TRIMESTRE, ANNÉE) 
+ entier : ENTIER 
+ date : DATE, TIMESTAMP ou CHAÎNE

Si vous fournissez un `STRING` comme argument de date, formatez-le comme valide`TIMESTAMP`. La fonction convertit automatiquement un `DATE` argument en`TIMESTAMP`.

**Exemples :**

```
os> source=people | eval `TIMESTAMPADD(DAY, 17, '2000-01-01 00:00:00')` = TIMESTAMPADD(DAY, 17, '2000-01-01 00:00:00') | eval `TIMESTAMPADD(QUARTER, -1, '2000-01-01 00:00:00')` = TIMESTAMPADD(QUARTER, -1, '2000-01-01 00:00:00') | fields `TIMESTAMPADD(DAY, 17, '2000-01-01 00:00:00')`, `TIMESTAMPADD(QUARTER, -1, '2000-01-01 00:00:00')`
fetched rows / total rows = 1/1
+----------------------------------------------+--------------------------------------------------+
| TIMESTAMPADD(DAY, 17, '2000-01-01 00:00:00') | TIMESTAMPADD(QUARTER, -1, '2000-01-01 00:00:00') |
|----------------------------------------------+--------------------------------------------------|
| 2000-01-18 00:00:00                          | 1999-10-01 00:00:00                              |
+----------------------------------------------+--------------------------------------------------+
```

##### `TIMESTAMPDIFF`
<a name="supported-ppl-date-time-functions-timestampdiff"></a>

**Utilisation** : `TIMESTAMPDIFF(interval, start, end)` renvoie la différence entre le début et la fin date/times en unités d'intervalle spécifiées.

**Arguments :** 
+ intervalle : INTERVALLE (SECONDE, MINUTE, HEURE, JOUR, SEMAINE, MOIS, TRIMESTRE, ANNÉE) 
+ début : DATE, TIMESTAMP ou CHAÎNE 
+ fin : DATE, TIMESTAMP ou STRING

La fonction convertit automatiquement les arguments en arguments `TIMESTAMP` lorsque cela est approprié. `STRING`Formatez les arguments en tant que `TIMESTAMP` s valides.

**Exemples :**

```
os> source=people | eval `TIMESTAMPDIFF(YEAR, '1997-01-01 00:00:00', '2001-03-06 00:00:00')` = TIMESTAMPDIFF(YEAR, '1997-01-01 00:00:00', '2001-03-06 00:00:00') | eval `TIMESTAMPDIFF(SECOND, timestamp('1997-01-01 00:00:23'), timestamp('1997-01-01 00:00:00'))` = TIMESTAMPDIFF(SECOND, timestamp('1997-01-01 00:00:23'), timestamp('1997-01-01 00:00:00')) | fields `TIMESTAMPDIFF(YEAR, '1997-01-01 00:00:00', '2001-03-06 00:00:00')`, `TIMESTAMPDIFF(SECOND, timestamp('1997-01-01 00:00:23'), timestamp('1997-01-01 00:00:00'))`
fetched rows / total rows = 1/1
+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+
| TIMESTAMPDIFF(YEAR, '1997-01-01 00:00:00', '2001-03-06 00:00:00') | TIMESTAMPDIFF(SECOND, timestamp('1997-01-01 00:00:23'), timestamp('1997-01-01 00:00:00')) |
|-------------------------------------------------------------------+-------------------------------------------------------------------------------------------|
| 4                                                                 | -23                                                                                       |
+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+
```

##### `UTC_TIMESTAMP`
<a name="supported-ppl-date-time-functions-utc-timestamp"></a>

**Utilisation** : `UTC_TIMESTAMP` renvoie l'horodatage UTC actuel sous forme de valeur dans « YYYY-MM-DD hh:mm:ss ».

**Type de retour** : TIMESTAMP

**Spécification** : UTC\$1TIMESTAMP () -> TIMESTAMP

**Exemple :**

```
> source=people | eval `UTC_TIMESTAMP()` = UTC_TIMESTAMP() | fields `UTC_TIMESTAMP()`
fetched rows / total rows = 1/1
+---------------------+
| UTC_TIMESTAMP()     |
|---------------------|
| 2022-10-03 17:54:28 |
+---------------------+
```

##### `CURRENT_TIMEZONE`
<a name="supported-ppl-date-time-functions-current-timezone"></a>

**Utilisation** : `CURRENT_TIMEZONE` renvoie le fuseau horaire local actuel.

**Type de retour** : STRING

**Exemple :**

```
> source=people | eval `CURRENT_TIMEZONE()` = CURRENT_TIMEZONE() | fields `CURRENT_TIMEZONE()`
fetched rows / total rows = 1/1
+------------------------+
| CURRENT_TIMEZONE()     |
|------------------------|
| America/Chicago        |
+------------------------+
```

##### Expressions PPL
<a name="supported-ppl-expressions"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

Les expressions, en particulier les expressions de valeur, renvoient une valeur scalaire. Les expressions ont différents types et formes. Par exemple, il existe des valeurs littérales sous forme d'expressions atomiques et des expressions arithmétiques, de prédicats et de fonctions basées sur celles-ci. Vous pouvez utiliser des expressions dans différentes clauses, par exemple en utilisant des expressions arithmétiques dans `Stats` les commandes `Filter` et.

**Opérateurs**

Une expression arithmétique est une expression formée de littéraux numériques et d'opérateurs arithmétiques binaires comme suit :

1. `+`: Ajouter.

1. `-`: Soustraire.

1. `*`: Multiplier.

1. `/`: Diviser (pour les entiers, le résultat est un entier dont la partie fractionnaire est supprimée)

1. `%`: Modulo (à utiliser uniquement avec des entiers ; le résultat est le reste de la division)

**Priorité**

Utilisez des parenthèses pour contrôler la priorité des opérateurs arithmétiques. Dans le cas contraire, les opérateurs de priorité supérieure sont exécutés en premier.

**Conversion de type**

Une conversion de type implicite est effectuée lors de la recherche de signatures d'opérateurs. Par exemple, un entier correspond à `+` un nombre réel à une signature`+(double,double)`, ce qui donne un nombre réel. Cette règle s'applique également aux appels de fonctions.

Exemple de différents types d'expressions arithmétiques :

```
os> source=accounts | where age > (25 + 5) | fields age ;
fetched rows / total rows = 3/3
+-------+
| age   |
|-------|
| 32    |
| 36    |
| 33    |
+-------+
```

**Opérateurs de prédicat**  
Un opérateur de prédicat est une expression qui est évaluée comme vraie. La comparaison `MISSING` des `NULL` valeurs et suit les règles suivantes : 
+ Une `MISSING` valeur n'est égale qu'à une `MISSING` valeur et est inférieure aux autres valeurs. 
+ Une `NULL` valeur est égale à une `NULL` valeur, est supérieure à une `MISSING` valeur, mais inférieure à toutes les autres valeurs.

**Opérateurs**


**Opérateurs de prédicat**  

| Nom | Description | 
| --- | --- | 
| > | Supérieur à l'opérateur | 
| >= | Opérateur supérieur ou égal | 
| < | Moins qu'un opérateur | 
| \$1= | Opérateur non égal | 
| <= | Opérateur inférieur ou égal | 
| = | Opérateur égal | 
| LIKE | Correspondance simple des motifs | 
| IN | Test de valeur NULL | 
| AND | Opérateur AND | 
| OR | Opérateur OR | 
| XOR | opérateur XOR | 
| NOT | Test de valeur NON NULLE | 

Vous pouvez comparer les dates et les heures. Lorsque vous comparez différents types de date/heure (par exemple `DATE` et`TIME`), les deux sont convertis en`DATETIME`. Les règles suivantes s'appliquent à la conversion :
+  `TIME`s'applique à la date d'aujourd'hui.
+ `DATE`est interprété à minuit.

**Opérateur de prédicat de base**  
Exemple d'opérateurs de comparaison :

```
os> source=accounts | where age > 33 | fields age ;
fetched rows / total rows = 1/1
+-------+
| age   |
|-------|
| 36    |
+-------+
```

**`IN`**  
Exemple de champ de test de `IN` l'opérateur dans les listes de valeurs :

```
os> source=accounts | where age in (32, 33) | fields age ;
fetched rows / total rows = 2/2
+-------+
| age   |
|-------|
| 32    |
| 33    |
+-------+
```

**`OR`**  
Exemple de l'`OR`opérateur :

```
os> source=accounts | where age = 32 OR age = 33 | fields age ;
fetched rows / total rows = 2/2
+-------+
| age   |
|-------|
| 32    |
| 33    |
+-------+
```

**`NOT`**  
Exemple de l'`NOT`opérateur :

```
os> source=accounts | where age not in (32, 33) | fields age ;
fetched rows / total rows = 2/2
+-------+
| age   |
|-------|
| 36    |
| 28    |
+-------+
```

##### Fonctions d'adresse IP PPL
<a name="supported-ppl-ip-address-functions"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

##### `CIDRMATCH`
<a name="supported-ppl-address-functions-cidrmatch"></a>

**Utilisation** : `CIDRMATCH(ip, cidr)` vérifie si l'adresse IP spécifiée se situe dans la plage CIDR donnée.

**Type d'argument :**
+ CHAÎNE, CHAÎNE
+ Type de retour : BOOLEAN

**Exemple :**

```
os> source=ips | where cidrmatch(ip, '***********/24') | fields ip
fetched rows / total rows = 1/1
+--------------+
| ip           |
|--------------|
| ***********  |
+--------------+

os> source=ipsv6 | where cidrmatch(ip, '2003:db8::/32') | fields ip
fetched rows / total rows = 1/1
+-----------------------------------------+
| ip                                      |
|-----------------------------------------|
| 2003:0db8:****:****:****:****:****:0000 |
+-----------------------------------------+
```

**Note**  
`ip`peut être une adresse IPv4 ou une IPv6 adresse.
`cidr`peut être un IPv4 ou un IPv6 bloc.
`ip`et `cidr` doit être soit les deux, IPv4 soit les deux IPv6.
`ip`et `cidr` doit être à la fois valide et non vide/non nul.

##### Fonctions JSON PPL
<a name="supported-ppl-json-functions"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

##### `JSON`
<a name="supported-ppl-json-functions-json"></a>

**Utilisation** : `json(value)` évalue si une chaîne peut être analysée au format JSON. La fonction renvoie la chaîne d'origine s'il s'agit d'un JSON valide, ou null s'il n'est pas valide.

**Type d'argument** : CHAÎNE

**Type de retour** : STRING/NULL. Expression STRING d'un format d'objet JSON valide.

**Exemples :**

```
os> source=people | eval `valid_json()` = json('[1,2,3,{"f1":1,"f2":[5,6]},4]') | fields valid_json
fetched rows / total rows = 1/1
+---------------------------------+
| valid_json                      |
+---------------------------------+
| [1,2,3,{"f1":1,"f2":[5,6]},4]   |
+---------------------------------+

os> source=people | eval `invalid_json()` = json('{"invalid": "json"') | fields invalid_json
fetched rows / total rows = 1/1
+----------------+
| invalid_json   |
+----------------+
| null           |
+----------------+
```

##### `JSON_OBJECT`
<a name="supported-ppl-json-functions-json-object"></a>

**Utilisation** : `json_object(<key>, <value>[, <key>, <value>]...)` renvoie un objet JSON à partir de membres de paires clé-valeur.

**Type d'argument :**
+ A <key>doit être une chaîne.
+ A <value>peut être n'importe quel type de données.

**Type de retour** : JSON\$1OBJECT. StructType Expression d'un objet JSON valide.

**Exemples :**

```
os> source=people | eval result = json_object('key', 123.45) | fields result
fetched rows / total rows = 1/1
+------------------+
| result           |
+------------------+
| {"key":123.45}   |
+------------------+

os> source=people | eval result = json_object('outer', json_object('inner', 123.45)) | fields result
fetched rows / total rows = 1/1
+------------------------------+
| result                       |
+------------------------------+
| {"outer":{"inner":123.45}}   |
+------------------------------+
```

##### `JSON_ARRAY`
<a name="supported-ppl-json-functions-json-array"></a>

**Utilisation** : `json_array(<value>...)` crée un TABLEAU JSON à l'aide d'une liste de valeurs.

**Type d'argument** : A `<value>` peut être n'importe quel type de valeur, telle qu'une chaîne, un nombre ou un booléen.

**Type de retour** : ARRAY. Un tableau de n'importe quel type de données pris en charge pour un tableau JSON valide.

**Exemples :**

```
os> source=people | eval `json_array` = json_array(1, 2, 0, -1, 1.1, -0.11)
fetched rows / total rows = 1/1
+------------------------------+
| json_array                   |
+------------------------------+
| [1.0,2.0,0.0,-1.0,1.1,-0.11] |
+------------------------------+

os> source=people | eval `json_array_object` = json_object("array", json_array(1, 2, 0, -1, 1.1, -0.11))
fetched rows / total rows = 1/1
+----------------------------------------+
| json_array_object                      |
+----------------------------------------+
| {"array":[1.0,2.0,0.0,-1.0,1.1,-0.11]} |
+----------------------------------------+
```

##### `TO_JSON_STRING`
<a name="supported-ppl-json-functions-to-json-string"></a>

**Utilisation** : `to_json_string(jsonObject)` renvoie une chaîne JSON avec une valeur d'objet JSON donnée.

**Type d'argument** : JSON\$1OBJECT 

**Type de retour** : STRING

**Exemples :**

```
os> source=people | eval `json_string` = to_json_string(json_array(1, 2, 0, -1, 1.1, -0.11)) | fields json_string
fetched rows / total rows = 1/1
+--------------------------------+
| json_string                    |
+--------------------------------+
| [1.0,2.0,0.0,-1.0,1.1,-0.11]   |
+--------------------------------+

os> source=people | eval `json_string` = to_json_string(json_object('key', 123.45)) | fields json_string
fetched rows / total rows = 1/1
+-----------------+
| json_string     |
+-----------------+
| {'key', 123.45} |
+-----------------+
```

##### `ARRAY_LENGTH`
<a name="supported-ppl-json-functions-array-length"></a>

**Utilisation** : `array_length(jsonArray)` renvoie le nombre d'éléments du tableau le plus externe.

**Type d'argument** : ARRAY. Un objet ARRAY ou JSON\$1ARRAY.

**Type de retour** : INTEGER

**Exemple :**

```
os> source=people | eval `json_array` = json_array_length(json_array(1,2,3,4)), `empty_array` = json_array_length(json_array())
fetched rows / total rows = 1/1
+--------------+---------------+
| json_array   | empty_array   |
+--------------+---------------+
| 4            | 0             |
+--------------+---------------+
```

##### `JSON_EXTRACT`
<a name="supported-ppl-json-functions-json-extract"></a>

**Utilisation** : `json_extract(jsonStr, path)` extrait un objet JSON d'une chaîne JSON en fonction du chemin JSON spécifié. La fonction renvoie null si la chaîne JSON d'entrée n'est pas valide.

**Type d'argument** : CHAÎNE, CHAÎNE

**Type de retour** : STRING
+ Expression STRING d'un format d'objet JSON valide.
+ `NULL`est renvoyé en cas de JSON non valide.

**Exemples :**

```
os> source=people | eval `json_extract('{"a":"b"}', '$.a')` = json_extract('{"a":"b"}', '$a')
fetched rows / total rows = 1/1
+----------------------------------+
| json_extract('{"a":"b"}', 'a')   |
+----------------------------------+
| b                                |
+----------------------------------+

os> source=people | eval `json_extract('{"a":[{"b":1},{"b":2}]}', '$.a[1].b')` = json_extract('{"a":[{"b":1},{"b":2}]}', '$.a[1].b')
fetched rows / total rows = 1/1
+-----------------------------------------------------------+
| json_extract('{"a":[{"b":1.0},{"b":2.0}]}', '$.a[1].b')   |
+-----------------------------------------------------------+
| 2.0                                                       |
+-----------------------------------------------------------+

os> source=people | eval `json_extract('{"a":[{"b":1},{"b":2}]}', '$.a[*].b')` = json_extract('{"a":[{"b":1},{"b":2}]}', '$.a[*].b')
fetched rows / total rows = 1/1
+-----------------------------------------------------------+
| json_extract('{"a":[{"b":1.0},{"b":2.0}]}', '$.a[*].b')   |
+-----------------------------------------------------------+
| [1.0,2.0]                                                 |
+-----------------------------------------------------------+

os> source=people | eval `invalid_json` = json_extract('{"invalid": "json"')
fetched rows / total rows = 1/1
+----------------+
| invalid_json   |
+----------------+
| null           |
+----------------+
```

##### `JSON_KEYS`
<a name="supported-ppl-json-functions-json-keys"></a>

**Utilisation** : `json_keys(jsonStr)` renvoie toutes les clés de l'objet JSON le plus externe sous forme de tableau.

**Type d'argument** : CHAÎNE. Expression STRING d'un format d'objet JSON valide.

**Type de retour** : ARRAY [STRING]. La fonction renvoie `NULL` toute autre chaîne JSON valide, une chaîne vide ou un JSON non valide.

**Exemples :**

```
os> source=people | eval `keys` = json_keys('{"f1":"abc","f2":{"f3":"a","f4":"b"}}')
fetched rows / total rows = 1/1
+------------+
| keus       |
+------------+
| [f1, f2]   |
+------------+

os> source=people | eval `keys` = json_keys('[1,2,3,{"f1":1,"f2":[5,6]},4]')
fetched rows / total rows = 1/1
+--------+
| keys   |
+--------+
| null   |
+--------+
```

##### `JSON_VALID`
<a name="supported-ppl-json-functions-json-valid"></a>

**Utilisation** : `json_valid(jsonStr)` évalue si une chaîne JSON utilise une syntaxe JSON valide et renvoie VRAI ou FAUX.

**Type d'argument** : CHAÎNE

**Type de retour** : BOOLEAN

**Exemples :**

```
os> source=people | eval `valid_json` = json_valid('[1,2,3,4]'), `invalid_json` = json_valid('{"invalid": "json"') | feilds `valid_json`, `invalid_json`
fetched rows / total rows = 1/1
+--------------+----------------+
| valid_json   | invalid_json   |
+--------------+----------------+
| True         | False          |
+--------------+----------------+

os> source=accounts | where json_valid('[1,2,3,4]') and isnull(email) | fields account_number, email
fetched rows / total rows = 1/1
+------------------+---------+
| account_number   | email   |
|------------------+---------|
| 13               | null    |
+------------------+---------+
```

##### Fonctions Lambda PPL
<a name="supported-ppl-lambda-functions"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

##### `EXISTS`
<a name="supported-ppl-lambda-functions-exists"></a>

**Utilisation** : `exists(array, lambda)` évalue si un prédicat Lambda est valable pour un ou plusieurs éléments du tableau.

**Type d'argument** : ARRAY, LAMBDA

**Type de retour** : BOOLEAN. Renvoie `TRUE` si au moins un élément du tableau répond au prédicat Lambda, sinon. `FALSE`

**Exemples :**

```
 os> source=people | eval array = json_array(1, -1, 2), result = exists(array, x -> x > 0) | fields result
fetched rows / total rows = 1/1
+-----------+
| result    |
+-----------+
| true      |
+-----------+

os> source=people | eval array = json_array(-1, -3, -2), result = exists(array, x -> x > 0) | fields result
fetched rows / total rows = 1/1
+-----------+
| result    |
+-----------+
| false     |
+-----------+
```

##### `FILTER`
<a name="supported-ppl-lambda-functions-filter"></a>

**Utilisation** : `filter(array, lambda)` filtre le tableau d'entrée en utilisant la fonction Lambda donnée.

**Type d'argument** : ARRAY, LAMBDA

**Type de retour** : ARRAY. Un ARRAY qui contient tous les éléments du tableau d'entrée qui répondent au prédicat lambda.

**Exemples :**

```
 os> source=people | eval array = json_array(1, -1, 2), result = filter(array, x -> x > 0) | fields result
fetched rows / total rows = 1/1
+-----------+
| result    |
+-----------+
| [1, 2]    |
+-----------+

os> source=people | eval array = json_array(-1, -3, -2), result = filter(array, x -> x > 0) | fields result
fetched rows / total rows = 1/1
+-----------+
| result    |
+-----------+
| []        |
+-----------+
```

##### `TRANSFORM`
<a name="supported-ppl-lambda-functions-transform"></a>

**Utilisation** : `transform(array, lambda)` transforme les éléments d'un tableau à l'aide de la fonction de transformation Lambda. Le deuxième argument implique l'indice de l'élément si vous utilisez la fonction Lambda binaire. Ceci est similaire `map` à une programmation fonctionnelle.

**Type d'argument** : ARRAY, LAMBDA

**Type de retour** : ARRAY. Un ARRAY qui contient le résultat de l'application de la fonction de transformation lambda à chaque élément du tableau d'entrée.

**Exemples :**

```
os> source=people | eval array = json_array(1, 2, 3), result = transform(array, x -> x + 1) | fields result
fetched rows / total rows = 1/1
+--------------+
| result       |
+--------------+
| [2, 3, 4]    |
+--------------+

os> source=people | eval array = json_array(1, 2, 3), result = transform(array, (x, i) -> x + i) | fields result
fetched rows / total rows = 1/1
+--------------+
| result       |
+--------------+
| [1, 3, 5]    |
+--------------+
```

##### `REDUCE`
<a name="supported-ppl-lambda-functions-reduce"></a>

**Utilisation** : `reduce(array, start, merge_lambda, finish_lambda)` réduit un tableau à une valeur unique en appliquant des fonctions lambda. La fonction applique le merge\$1lambda à la valeur de départ et à tous les éléments du tableau, puis l'applique au `finish_lambda` résultat.

**Type d'argument** : ARRAY, ANY, LAMBDA, LAMBDA

**Type de retour** : N'IMPORTE LEQUEL. Résultat final de l'application des fonctions Lambda à la valeur de départ et au tableau d'entrée.

**Exemples :**

```
 os> source=people | eval array = json_array(1, 2, 3), result = reduce(array, 0, (acc, x) -> acc + x) | fields result
fetched rows / total rows = 1/1
+-----------+
| result    |
+-----------+
| 6         |
+-----------+

os> source=people | eval array = json_array(1, 2, 3), result = reduce(array, 10, (acc, x) -> acc + x) | fields result
fetched rows / total rows = 1/1
+-----------+
| result    |
+-----------+
| 16        |
+-----------+

os> source=people | eval array = json_array(1, 2, 3), result = reduce(array, 0, (acc, x) -> acc + x, acc -> acc * 10) | fields result
fetched rows / total rows = 1/1
+-----------+
| result    |
+-----------+
| 60        |
+-----------+
```

##### Fonctions mathématiques PPL
<a name="supported-ppl-math-functions"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

##### `ABS`
<a name="supported-ppl-math-functions-abs"></a>

**Utilisation** : `ABS(x) ` calcule la valeur absolue de x.

**Type d'argument :** INTEGER/LONG/FLOAT/DOUBLE

**Type de retour :** INTEGER/LONG/FLOAT/DOUBLE

**Exemple :**

```
os> source=people | eval `ABS(-1)` = ABS(-1) | fields `ABS(-1)`
fetched rows / total rows = 1/1
+-----------+
| ABS(-1)   |
|-----------|
| 1         |
+-----------+
```

##### `ACOS`
<a name="supported-ppl-math-functions-acos"></a>

**Utilisation** : `ACOS(x)` calcule l'arc cosinus de x. Elle retourne `NULL` si x n'est pas compris entre -1 et 1.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `ACOS(0)` = ACOS(0) | fields `ACOS(0)`
fetched rows / total rows = 1/1
+--------------------+
| ACOS(0)            |
|--------------------|
| 1.5707963267948966 |
+--------------------+
```

##### `ASIN`
<a name="supported-ppl-math-functions-asin"></a>

**Utilisation** : `asin(x)` calcule l'arc sinusoïdal de x. Elle retourne `NULL` si x n'est pas compris entre -1 et 1.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `ASIN(0)` = ASIN(0) | fields `ASIN(0)`
fetched rows / total rows = 1/1
+-----------+
| ASIN(0)   |
|-----------|
| 0.0       |
+-----------+
```

##### `ATAN`
<a name="supported-ppl-math-functions-atan"></a>

**Utilisation** : `ATAN(x)` calcule la tangente d'arc de x. `atan(y, x)` Calcule la tangente d'arc de y/x, sauf que les signes des deux arguments déterminent le quadrant du résultat.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `ATAN(2)` = ATAN(2), `ATAN(2, 3)` = ATAN(2, 3) | fields `ATAN(2)`, `ATAN(2, 3)`
fetched rows / total rows = 1/1
+--------------------+--------------------+
| ATAN(2)            | ATAN(2, 3)         |
|--------------------+--------------------|
| 1.1071487177940904 | 0.5880026035475675 |
+--------------------+--------------------+
```

##### `ATAN2`
<a name="supported-ppl-math-functions-atan2"></a>

**Utilisation** : `ATAN2(y, x)` calcule l'arc tangent de y/ x, sauf que les signes des deux arguments déterminent le quadrant du résultat.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `ATAN2(2, 3)` = ATAN2(2, 3) | fields `ATAN2(2, 3)`
fetched rows / total rows = 1/1
+--------------------+
| ATAN2(2, 3)        |
|--------------------|
| 0.5880026035475675 |
+--------------------+
```

##### `CBRT`
<a name="supported-ppl-math-functions-cbrt"></a>

**Utilisation** : `CBRT` calcule la racine cubique d'un nombre.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE :

INTEGER/LONG/FLOAT/DOUBLE-> DOUBLE

**Exemple :**

```
opensearchsql> source=location | eval `CBRT(8)` = CBRT(8), `CBRT(9.261)` = CBRT(9.261), `CBRT(-27)` = CBRT(-27) | fields `CBRT(8)`, `CBRT(9.261)`, `CBRT(-27)`;
fetched rows / total rows = 2/2
+-----------+---------------+-------------+
| CBRT(8)   | CBRT(9.261)   | CBRT(-27)   |
|-----------+---------------+-------------|
| 2.0       | 2.1           | -3.0        |
| 2.0       | 2.1           | -3.0        |
+-----------+---------------+-------------+
```

##### `CEIL`
<a name="supported-ppl-math-functions-ceil"></a>

**Utilisation** : alias de la `CEILING` fonction. `CEILING(T)`prend le plafond de valeur T.

**Limitation** : `CEILING` ne fonctionne comme prévu que lorsque le type double IEEE 754 affiche une décimale lors du stockage.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : LONG

**Exemple :**

```
os> source=people | eval `CEILING(0)` = CEILING(0), `CEILING(50.00005)` = CEILING(50.00005), `CEILING(-50.00005)` = CEILING(-50.00005) | fields `CEILING(0)`, `CEILING(50.00005)`, `CEILING(-50.00005)`
fetched rows / total rows = 1/1
+--------------+---------------------+----------------------+
| CEILING(0)   | CEILING(50.00005)   | CEILING(-50.00005)   |
|--------------+---------------------+----------------------|
| 0            | 51                  | -50                  |
+--------------+---------------------+----------------------+

os> source=people | eval `CEILING(3147483647.12345)` = CEILING(3147483647.12345), `CEILING(113147483647.12345)` = CEILING(113147483647.12345), `CEILING(3147483647.00001)` = CEILING(3147483647.00001) | fields `CEILING(3147483647.12345)`, `CEILING(113147483647.12345)`, `CEILING(3147483647.00001)`
fetched rows / total rows = 1/1
+-----------------------------+-------------------------------+-----------------------------+
| CEILING(3147483647.12345)   | CEILING(113147483647.12345)   | CEILING(3147483647.00001)   |
|-----------------------------+-------------------------------+-----------------------------|
| 3147483648                  | 113147483648                  | 3147483648                  |
+-----------------------------+-------------------------------+-----------------------------+
```

##### `CONV`
<a name="supported-ppl-math-functions-conv"></a>

**Utilisation** : `CONV(x, a, b)` convertit le nombre x d'une base en une base b.

**Type d'argument** : x : CHAÎNE, a : ENTIER, b : ENTIER

**Type de retour** : STRING

**Exemple :**

```
os> source=people | eval `CONV('12', 10, 16)` = CONV('12', 10, 16), `CONV('2C', 16, 10)` = CONV('2C', 16, 10), `CONV(12, 10, 2)` = CONV(12, 10, 2), `CONV(1111, 2, 10)` = CONV(1111, 2, 10) | fields `CONV('12', 10, 16)`, `CONV('2C', 16, 10)`, `CONV(12, 10, 2)`, `CONV(1111, 2, 10)`
fetched rows / total rows = 1/1
+----------------------+----------------------+-------------------+---------------------+
| CONV('12', 10, 16)   | CONV('2C', 16, 10)   | CONV(12, 10, 2)   | CONV(1111, 2, 10)   |
|----------------------+----------------------+-------------------+---------------------|
| c                    | 44                   | 1100              | 15                  |
+----------------------+----------------------+-------------------+---------------------+
```

##### `COS`
<a name="supported-ppl-math-functions-cos"></a>

**Utilisation** : `COS(x)` calcule le cosinus de x, où x est donné en radians.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour :** DOUBLE

**Exemple :**

```
os> source=people | eval `COS(0)` = COS(0) | fields `COS(0)`
fetched rows / total rows = 1/1
+----------+
| COS(0)   |
|----------|
| 1.0      |
+----------+
```

##### `COT`
<a name="supported-ppl-math-functions-cot"></a>

**Utilisation** : `COT(x)` calcule la cotangente de x. Elle renvoie out-of-range une erreur si x est égal à 0.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `COT(1)` = COT(1) | fields `COT(1)`
fetched rows / total rows = 1/1
+--------------------+
| COT(1)             |
|--------------------|
| 0.6420926159343306 |
+--------------------+
```

##### `CRC32`
<a name="supported-ppl-math-functions-crc32"></a>

**Utilisation** : `CRC32` calcule une valeur de contrôle de redondance cyclique et renvoie une valeur non signée de 32 bits.

**Type d'argument** : CHAÎNE

**Type de retour** : LONG

**Exemple :**

```
os> source=people | eval `CRC32('MySQL')` = CRC32('MySQL') | fields `CRC32('MySQL')`
fetched rows / total rows = 1/1
+------------------+
| CRC32('MySQL')   |
|------------------|
| 3259397556       |
+------------------+
```

##### `DEGREES`
<a name="supported-ppl-math-functions-degrees"></a>

**Utilisation** : `DEGREES(x)` convertit x de radians en degrés.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `DEGREES(1.57)` = DEGREES(1.57) | fields `DEGREES(1.57)`
fetched rows / total rows  = 1/1
+-------------------+
| DEGREES(1.57)     |
|-------------------|
| 89.95437383553924 |
+-------------------+
```

##### `E`
<a name="supported-ppl-math-functions-e"></a>

**Utilisation** : `E()` renvoie le numéro d'Euler.

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `E()` = E() | fields `E()`
fetched rows / total rows = 1/1
+-------------------+
| E()               |
|-------------------|
| 2.718281828459045 |
+-------------------+
```

##### `EXP`
<a name="supported-ppl-math-functions-exp"></a>

**Utilisation** : `EXP(x)` renvoie e élevé à la puissance de x.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `EXP(2)` = EXP(2) | fields `EXP(2)`
fetched rows / total rows = 1/1
+------------------+
| EXP(2)           |
|------------------|
| 7.38905609893065 |
+------------------+
```

##### `FLOOR`
<a name="supported-ppl-math-functions-floor"></a>

**Utilisation** : `FLOOR(T)` prend le plancher de la valeur T.

**Limitation** : `FLOOR` ne fonctionne comme prévu que lorsque le type double IEEE 754 affiche une décimale lors du stockage.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : LONG

**Exemple :**

```
os> source=people | eval `FLOOR(0)` = FLOOR(0), `FLOOR(50.00005)` = FLOOR(50.00005), `FLOOR(-50.00005)` = FLOOR(-50.00005) | fields `FLOOR(0)`, `FLOOR(50.00005)`, `FLOOR(-50.00005)`
fetched rows / total rows = 1/1
+------------+-------------------+--------------------+
| FLOOR(0)   | FLOOR(50.00005)   | FLOOR(-50.00005)   |
|------------+-------------------+--------------------|
| 0          | 50                | -51                |
+------------+-------------------+--------------------+

os> source=people | eval `FLOOR(3147483647.12345)` = FLOOR(3147483647.12345), `FLOOR(113147483647.12345)` = FLOOR(113147483647.12345), `FLOOR(3147483647.00001)` = FLOOR(3147483647.00001) | fields `FLOOR(3147483647.12345)`, `FLOOR(113147483647.12345)`, `FLOOR(3147483647.00001)`
fetched rows / total rows = 1/1
+---------------------------+-----------------------------+---------------------------+
| FLOOR(3147483647.12345)   | FLOOR(113147483647.12345)   | FLOOR(3147483647.00001)   |
|---------------------------+-----------------------------+---------------------------|
| 3147483647                | 113147483647                | 3147483647                |
+---------------------------+-----------------------------+---------------------------+

os> source=people | eval `FLOOR(282474973688888.022)` = FLOOR(282474973688888.022), `FLOOR(9223372036854775807.022)` = FLOOR(9223372036854775807.022), `FLOOR(9223372036854775807.0000001)` = FLOOR(9223372036854775807.0000001) | fields `FLOOR(282474973688888.022)`, `FLOOR(9223372036854775807.022)`, `FLOOR(9223372036854775807.0000001)`
fetched rows / total rows = 1/1
+------------------------------+----------------------------------+--------------------------------------+
| FLOOR(282474973688888.022)   | FLOOR(9223372036854775807.022)   | FLOOR(9223372036854775807.0000001)   |
|------------------------------+----------------------------------+--------------------------------------|
| 282474973688888              | 9223372036854775807              | 9223372036854775807                  |
+------------------------------+----------------------------------+--------------------------------------+
```

##### `LN`
<a name="supported-ppl-math-functions-ln"></a>

**Utilisation** : `LN(x)` renvoie le logarithme naturel de x.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `LN(2)` = LN(2) | fields `LN(2)`
fetched rows / total rows = 1/1
+--------------------+
| LN(2)              |
|--------------------|
| 0.6931471805599453 |
+--------------------+
```

##### `LOG`
<a name="supported-ppl-math-functions-log"></a>

**Utilisation** : `LOG(x)` renvoie le logarithme naturel de x qui est le logarithme en base e du x. log (B, x) est équivalent à log (x) /log (B).

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `LOG(2)` = LOG(2), `LOG(2, 8)` = LOG(2, 8) | fields `LOG(2)`, `LOG(2, 8)`
fetched rows / total rows = 1/1
+--------------------+-------------+
| LOG(2)             | LOG(2, 8)   |
|--------------------+-------------|
| 0.6931471805599453 | 3.0         |
+--------------------+-------------+
```

##### `LOG2`
<a name="supported-ppl-math-functions-log2"></a>

**Utilisation** : `LOG2(x)` est équivalent à`log(x)`/`log(2)`.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `LOG2(8)` = LOG2(8) | fields `LOG2(8)`
fetched rows / total rows = 1/1
+-----------+
| LOG2(8)   |
|-----------|
| 3.0       |
+-----------+
```

##### `LOG10`
<a name="supported-ppl-math-functions-log10"></a>

**Utilisation** : `LOG10(x)` est équivalent à`log(x)`/`log(10)`.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `LOG10(100)` = LOG10(100) | fields `LOG10(100)`
fetched rows / total rows = 1/1
+--------------+
| LOG10(100)   |
|--------------|
| 2.0          |
+--------------+
```

##### `MOD`
<a name="supported-ppl-math-functions-mod"></a>

**Utilisation** : `MOD(n, m)` calcule le reste du nombre n divisé par m.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : type plus large entre les types de n et m si m est une valeur différente de zéro. Si m est égal à 0, renvoie NULL.

**Exemple :**

```
os> source=people | eval `MOD(3, 2)` = MOD(3, 2), `MOD(3.1, 2)` = MOD(3.1, 2) | fields `MOD(3, 2)`, `MOD(3.1, 2)`
fetched rows / total rows = 1/1
+-------------+---------------+
| MOD(3, 2)   | MOD(3.1, 2)   |
|-------------+---------------|
| 1           | 1.1           |
+-------------+---------------+
```

##### `PI`
<a name="supported-ppl-math-functions-pi"></a>

**Utilisation** : `PI() ` renvoie la constante pi.

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `PI()` = PI() | fields `PI()`
fetched rows / total rows = 1/1
+-------------------+
| PI()              |
|-------------------|
| 3.141592653589793 |
+-------------------+
```

##### `POW`
<a name="supported-ppl-math-functions-pow"></a>

**Utilisation** : `POW(x, y)` calcule la valeur de x élevée à la puissance de y. Les entrées incorrectes renvoient un `NULL` résultat.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Synonymes** : `POWER(_, _)`

**Exemple :**

```
os> source=people | eval `POW(3, 2)` = POW(3, 2), `POW(-3, 2)` = POW(-3, 2), `POW(3, -2)` = POW(3, -2) | fields `POW(3, 2)`, `POW(-3, 2)`, `POW(3, -2)`
fetched rows / total rows = 1/1
+-------------+--------------+--------------------+
| POW(3, 2)   | POW(-3, 2)   | POW(3, -2)         |
|-------------+--------------+--------------------|
| 9.0         | 9.0          | 0.1111111111111111 |
+-------------+--------------+--------------------+
```

##### POWER
<a name="supported-ppl-math-functions-power"></a>

**Utilisation** : `POWER(x, y)` calcule la valeur de x élevée à la puissance de y. Les entrées incorrectes renvoient un `NULL` résultat.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Synonymes** : `POW(_, _)`

**Exemple :**

```
os> source=people | eval `POWER(3, 2)` = POWER(3, 2), `POWER(-3, 2)` = POWER(-3, 2), `POWER(3, -2)` = POWER(3, -2) | fields `POWER(3, 2)`, `POWER(-3, 2)`, `POWER(3, -2)`
fetched rows / total rows = 1/1
+---------------+----------------+--------------------+
| POWER(3, 2)   | POWER(-3, 2)   | POWER(3, -2)       |
|---------------+----------------+--------------------|
| 9.0           | 9.0            | 0.1111111111111111 |
+---------------+----------------+--------------------+
```

##### `RADIANS`
<a name="supported-ppl-math-functions-radians"></a>

**Utilisation** : `RADIANS(x)` convertit x de degrés en radians.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour** : DOUBLE

**Exemple :**

```
os> source=people | eval `RADIANS(90)` = RADIANS(90) | fields `RADIANS(90)`
fetched rows / total rows  = 1/1
+--------------------+
| RADIANS(90)        |
|--------------------|
| 1.5707963267948966 |
+--------------------+
```

##### `RAND`
<a name="supported-ppl-math-functions-rand"></a>

**Utilisation** :`RAND()`/`RAND(N)`renvoie une valeur à virgule flottante aléatoire comprise entre 0 <= valeur < 1,0. Si vous spécifiez un entier N, la fonction initialise la graine avant son exécution. L'une des conséquences de ce comportement est qu'avec un argument N identique, `rand(N)` renvoie la même valeur à chaque fois, ce qui produit une séquence répétable de valeurs de colonne.

**Type d'argument** : INTEGER

**Type de retour** : FLOAT

**Exemple :**

```
os> source=people | eval `RAND(3)` = RAND(3) | fields `RAND(3)`
fetched rows / total rows = 1/1
+------------+
| RAND(3)    |
|------------|
| 0.73105735 |
+------------+
```

##### `ROUND`
<a name="supported-ppl-math-functions-round"></a>

**Utilisation** : `ROUND(x, d)` arrondit l'argument x à d décimales. Si vous ne spécifiez pas d, la valeur par défaut est 0.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Carte des types de retour** :
+ (ENTIER/LONG [, ENTIER]) -> LONG
+ (FLOAT/DOUBLE [, ENTIER]) -> LONG

**Exemple :**

```
os> source=people | eval `ROUND(12.34)` = ROUND(12.34), `ROUND(12.34, 1)` = ROUND(12.34, 1), `ROUND(12.34, -1)` = ROUND(12.34, -1), `ROUND(12, 1)` = ROUND(12, 1) | fields `ROUND(12.34)`, `ROUND(12.34, 1)`, `ROUND(12.34, -1)`, `ROUND(12, 1)`
fetched rows / total rows = 1/1
+----------------+-------------------+--------------------+----------------+
| ROUND(12.34)   | ROUND(12.34, 1)   | ROUND(12.34, -1)   | ROUND(12, 1)   |
|----------------+-------------------+--------------------+----------------|
| 12.0           | 12.3              | 10.0               | 12             |
+----------------+-------------------+--------------------+----------------+
```

##### `SIGN`
<a name="supported-ppl-math-functions-sign"></a>

**Utilisation** : `SIGN` renvoie le signe de l'argument sous la forme -1, 0 ou 1, selon que le nombre est négatif, nul ou positif.

**Type d'argument** : INTEGER/LONG/FLOAT/DOUBLE

**Type de retour :** INTEGER

**Exemple :**

```
os> source=people | eval `SIGN(1)` = SIGN(1), `SIGN(0)` = SIGN(0), `SIGN(-1.1)` = SIGN(-1.1) | fields `SIGN(1)`, `SIGN(0)`, `SIGN(-1.1)`
fetched rows / total rows = 1/1
+-----------+-----------+--------------+
| SIGN(1)   | SIGN(0)   | SIGN(-1.1)   |
|-----------+-----------+--------------|
| 1         | 0         | -1           |
+-----------+-----------+--------------+
```

##### `SIN`
<a name="supported-ppl-math-functions-sin"></a>

**Utilisation** : `sin(x)` calcule le sinus de x, où x est exprimé en radians.

**Type d'argument :** INTEGER/LONG/FLOAT/DOUBLE

**Type de retour :** DOUBLE

**Exemple :**

```
os> source=people | eval `SIN(0)` = SIN(0) | fields `SIN(0)`
fetched rows / total rows = 1/1
+----------+
| SIN(0)   |
|----------|
| 0.0      |
+----------+
```

##### `SQRT`
<a name="supported-ppl-math-functions-sqrt"></a>

**Utilisation** : `SQRT` calcule la racine carrée d'un nombre non négatif.

**Type d'argument :** INTEGER/LONG/FLOAT/DOUBLE

**Carte des types de retour :**
+ (Non négatif) INTEGER/LONG/FLOAT/DOUBLE -> DOUBLE
+ (Négatif) INTEGER/LONG/FLOAT/DOUBLE -> NULL

**Exemple :**

```
os> source=people | eval `SQRT(4)` = SQRT(4), `SQRT(4.41)` = SQRT(4.41) | fields `SQRT(4)`, `SQRT(4.41)`
fetched rows / total rows = 1/1
+-----------+--------------+
| SQRT(4)   | SQRT(4.41)   |
|-----------+--------------|
| 2.0       | 2.1          |
+-----------+--------------+
```

##### Fonctions de chaîne PPL
<a name="supported-ppl-string-functions"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

##### `CONCAT`
<a name="supported-ppl-string-functions-concat"></a>

**Utilisation** : `CONCAT(str1, str2, ...., str_9)` additionne jusqu'à 9 chaînes.

**Type d'argument :**
+ CHAÎNE, CHAÎNE,..., CHAÎNE
+ Type de retour : STRING

**Exemple :**

```
os> source=people | eval `CONCAT('hello', 'world')` = CONCAT('hello', 'world'), `CONCAT('hello ', 'whole ', 'world', '!')` = CONCAT('hello ', 'whole ', 'world', '!') | fields `CONCAT('hello', 'world')`, `CONCAT('hello ', 'whole ', 'world', '!')`
fetched rows / total rows = 1/1
+----------------------------+--------------------------------------------+
| CONCAT('hello', 'world')   | CONCAT('hello ', 'whole ', 'world', '!')   |
|----------------------------+--------------------------------------------|
| helloworld                 | hello whole world!                         |
+----------------------------+--------------------------------------------+
```

##### `CONCAT_WS`
<a name="supported-ppl-string-functions-concat-ws"></a>

**Utilisation** : `CONCAT_WS(sep, str1, str2)` concatène deux chaînes ou plus en utilisant un séparateur spécifié entre elles.

**Type d'argument :**
+ CHAÎNE, CHAÎNE,..., CHAÎNE
+ Type de retour : STRING

**Exemple :**

```
os> source=people | eval `CONCAT_WS(',', 'hello', 'world')` = CONCAT_WS(',', 'hello', 'world') | fields `CONCAT_WS(',', 'hello', 'world')`
fetched rows / total rows = 1/1
+------------------------------------+
| CONCAT_WS(',', 'hello', 'world')   |
|------------------------------------|
| hello,world                        |
+------------------------------------+
```

##### `LENGTH`
<a name="supported-ppl-string-functions-length"></a>

**Utilisation** : `length(str)` renvoie la longueur de la chaîne d'entrée mesurée en octets.

**Type d'argument :**
+ CHAÎNE
+ Type de retour : INTEGER

**Exemple :**

```
os> source=people | eval `LENGTH('helloworld')` = LENGTH('helloworld') | fields `LENGTH('helloworld')`
fetched rows / total rows = 1/1
+------------------------+
| LENGTH('helloworld')   |
|------------------------|
| 10                     |
+------------------------+
```

##### `LOWER`
<a name="supported-ppl-string-functions-lower"></a>

**Utilisation** : `lower(string)` convertit la chaîne d'entrée en minuscules.

**Type d'argument :**
+ CHAÎNE
+ Type de retour : STRING

**Exemple :**

```
os> source=people | eval `LOWER('helloworld')` = LOWER('helloworld'), `LOWER('HELLOWORLD')` = LOWER('HELLOWORLD') | fields `LOWER('helloworld')`, `LOWER('HELLOWORLD')`
fetched rows / total rows = 1/1
+-----------------------+-----------------------+
| LOWER('helloworld')   | LOWER('HELLOWORLD')   |
|-----------------------+-----------------------|
| helloworld            | helloworld            |
+-----------------------+-----------------------+
```

##### `LTRIM`
<a name="supported-ppl-string-functions-ltrim"></a>

**Utilisation** : `ltrim(str)` supprime les espaces de début de la chaîne d'entrée.

**Type d'argument :**
+ CHAÎNE
+ Type de retour : STRING

**Exemple :**

```
os> source=people | eval `LTRIM('   hello')` = LTRIM('   hello'), `LTRIM('hello   ')` = LTRIM('hello   ') | fields `LTRIM('   hello')`, `LTRIM('hello   ')`
fetched rows / total rows = 1/1
+---------------------+---------------------+
| LTRIM('   hello')   | LTRIM('hello   ')   |
|---------------------+---------------------|
| hello               | hello               |
+---------------------+---------------------+
```

##### `POSITION`
<a name="supported-ppl-string-functions-position"></a>

**Utilisation** : `POSITION(substr IN str)` renvoie la position de la première occurrence d'une sous-chaîne dans une chaîne. Elle renvoie 0 si la sous-chaîne n'est pas dans la chaîne. Elle renvoie NULL si l'un des arguments est NULL.

**Type d'argument :**
+ CHAÎNE, CHAÎNE
+ Type de retour INTEGER

**Exemple :**

```
os> source=people | eval `POSITION('world' IN 'helloworld')` = POSITION('world' IN 'helloworld'), `POSITION('invalid' IN 'helloworld')`= POSITION('invalid' IN 'helloworld')  | fields `POSITION('world' IN 'helloworld')`, `POSITION('invalid' IN 'helloworld')`
fetched rows / total rows = 1/1
+-------------------------------------+---------------------------------------+
| POSITION('world' IN 'helloworld')   | POSITION('invalid' IN 'helloworld')   |
|-------------------------------------+---------------------------------------|
| 6                                   | 0                                     |
+-------------------------------------+---------------------------------------+
```

##### `REVERSE`
<a name="supported-ppl-string-functions-reverse"></a>

**Utilisation** : `REVERSE(str)` renvoie la chaîne inversée de la chaîne d'entrée.

**Type d'argument :**
+ CHAÎNE
+ Type de retour : STRING

**Exemple :**

```
os> source=people | eval `REVERSE('abcde')` = REVERSE('abcde') | fields `REVERSE('abcde')`
fetched rows / total rows = 1/1
+--------------------+
| REVERSE('abcde')   |
|--------------------|
| edcba              |
+--------------------+
```

##### `RIGHT`
<a name="supported-ppl-string-functions-right"></a>

**Utilisation** : `right(str, len)` renvoie les caractères les plus à droite de la chaîne d'entrée. Elle renvoie 0 si la sous-chaîne n'est pas dans la chaîne. Elle renvoie NULL si l'un des arguments est NULL.

**Type d'argument :**
+ CHAÎNE, ENTIER
+ Type de retour : STRING

**Exemple :**

```
os> source=people | eval `RIGHT('helloworld', 5)` = RIGHT('helloworld', 5), `RIGHT('HELLOWORLD', 0)` = RIGHT('HELLOWORLD', 0) | fields `RIGHT('helloworld', 5)`, `RIGHT('HELLOWORLD', 0)`
fetched rows / total rows = 1/1
+--------------------------+--------------------------+
| RIGHT('helloworld', 5)   | RIGHT('HELLOWORLD', 0)   |
|--------------------------+--------------------------|
| world                    |                          |
+--------------------------+--------------------------+
```

##### `RTRIM`
<a name="supported-ppl-string-functions-rtrim"></a>

**Utilisation** : `rtrim(str)` supprime les espaces de fin de la chaîne d'entrée.

**Type d'argument :**
+ CHAÎNE
+ Type de retour : **STRING**

**Exemple :**

```
os> source=people | eval `RTRIM('   hello')` = RTRIM('   hello'), `RTRIM('hello   ')` = RTRIM('hello   ') | fields `RTRIM('   hello')`, `RTRIM('hello   ')`
fetched rows / total rows = 1/1
+---------------------+---------------------+
| RTRIM('   hello')   | RTRIM('hello   ')   |
|---------------------+---------------------|
|    hello            | hello               |
+---------------------+---------------------+
```

##### `SUBSTRING`
<a name="supported-ppl-string-functions-substring"></a>

**Utilisation** : `substring(str, start)` or `substring(str, start, length)` renvoie une sous-chaîne de la chaîne d'entrée. Si aucune longueur n'est spécifiée, elle renvoie la chaîne entière à partir de la position de départ.

**Type d'argument :**
+ CHAÎNE, ENTIER, ENTIER
+ Type de retour : STRING

**Exemple :**

```
os> source=people | eval `SUBSTRING('helloworld', 5)` = SUBSTRING('helloworld', 5), `SUBSTRING('helloworld', 5, 3)` = SUBSTRING('helloworld', 5, 3) | fields `SUBSTRING('helloworld', 5)`, `SUBSTRING('helloworld', 5, 3)`
fetched rows / total rows = 1/1
+------------------------------+---------------------------------+
| SUBSTRING('helloworld', 5)   | SUBSTRING('helloworld', 5, 3)   |
|------------------------------+---------------------------------|
| oworld                       | owo                             |
+------------------------------+---------------------------------+
```

##### `TRIM`
<a name="supported-ppl-string-functions-trim"></a>

**Utilisation** : `trim(string)` supprime les espaces de début et de fin de la chaîne d'entrée.

**Type d'argument :**
+ CHAÎNE
+ Type de retour : **STRING**

**Exemple :**

```
os> source=people | eval `TRIM('   hello')` = TRIM('   hello'), `TRIM('hello   ')` = TRIM('hello   ') | fields `TRIM('   hello')`, `TRIM('hello   ')`
fetched rows / total rows = 1/1
+--------------------+--------------------+
| TRIM('   hello')   | TRIM('hello   ')   |
|--------------------+--------------------|
| hello              | hello              |
+--------------------+--------------------+
```

##### `UPPER`
<a name="supported-ppl-string-functions-upper"></a>

**Utilisation** : `upper(string)` convertit la chaîne d'entrée en majuscules.

**Type d'argument :**
+ CHAÎNE
+ Type de retour : STRING

**Exemple :**

```
os> source=people | eval `UPPER('helloworld')` = UPPER('helloworld'), `UPPER('HELLOWORLD')` = UPPER('HELLOWORLD') | fields `UPPER('helloworld')`, `UPPER('HELLOWORLD')`
fetched rows / total rows = 1/1
+-----------------------+-----------------------+
| UPPER('helloworld')   | UPPER('HELLOWORLD')   |
|-----------------------+-----------------------|
| HELLOWORLD            | HELLOWORLD            |
+-----------------------+-----------------------+
```

##### Fonctions de conversion de type PPL
<a name="supported-ppl-type-conversion-functions"></a>

**Note**  
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette fonction PPL, consultez. [Fonctions](#supported-ppl-functions)

##### `TRIM`
<a name="supported-ppl-conversion-functions-cast"></a>

**Utilisation** : `cast(expr as dateType)` convertit le `expr` en `dataType` et renvoie la valeur du`dataType`. 

Les règles de conversion suivantes s'appliquent :


**Règles de conversion de type**  

| Src/Cible | CHAÎNE | NOMBRE | BOOLEAN | TIMESTAMP | DATE | TIME | 
| --- | --- | --- | --- | --- | --- | --- | 
| CHAÎNE |  | Remarque 1 | Remarque 1 | HORODATAGE () | DATE () | HEURE () | 
| NOMBRE | Remarque 1 |  | v \$1 =0 | N/A | N/A | N/A | 
| BOOLEAN | Remarque 1 | v ? 1:0 |  | N/A | N/A | N/A | 
| TIMESTAMP | Remarque 1 | N/A | N/A |  | DATE () | HEURE () | 
| DATE | Remarque 1 | N/A | N/A | N/A |  | N/A | 
| TIME | Remarque 1 | N/A | N/A | N/A | N/A |  | 

**Exemple de conversion en chaîne :**

```
os> source=people | eval `cbool` = CAST(true as string), `cint` = CAST(1 as string), `cdate` = CAST(CAST('2012-08-07' as date) as string) | fields `cbool`, `cint`, `cdate`
fetched rows / total rows = 1/1
+---------+--------+------------+
| cbool   | cint   | cdate      |
|---------+--------+------------|
| true    | 1      | 2012-08-07 |
+---------+--------+------------+
```

**Exemple de conversion numérique :**

```
os> source=people | eval `cbool` = CAST(true as int), `cstring` = CAST('1' as int) | fields `cbool`, `cstring`
fetched rows / total rows = 1/1
+---------+-----------+
| cbool   | cstring   |
|---------+-----------|
| 1       | 1         |
+---------+-----------+
```

**Exemple de diffusion à ce jour :**

```
os> source=people | eval `cdate` = CAST('2012-08-07' as date), `ctime` = CAST('01:01:01' as time), `ctimestamp` = CAST('2012-08-07 01:01:01' as timestamp) | fields `cdate`, `ctime`, `ctimestamp`
fetched rows / total rows = 1/1
+------------+----------+---------------------+
| cdate      | ctime    | ctimestamp          |
|------------+----------+---------------------|
| 2012-08-07 | 01:01:01 | 2012-08-07 01:01:01 |
+------------+----------+---------------------+
```

**Exemple de casting enchaîné :**

```
os> source=people | eval `cbool` = CAST(CAST(true as string) as boolean) | fields `cbool`
fetched rows / total rows = 1/1
+---------+
| cbool   |
|---------|
| True    |
+---------+
```