Catégories :

Fonctions de données semi-structurées et structurées (Ordre supérieur)

FILTER

Filtre un tableau en fonction de la logique d’une expression lambda.

Voir aussi :

Utilisation de fonctions Lambda sur les données avec les fonctions d’ordre supérieur de Snowflake

Syntaxe

FILTER( <array> , <lambda_expression> )
Copy

Arguments

array

Tableau qui contient les éléments à filtrer. Le tableau peut être semi-structuré ou structuré.

lambda_expression

Expression lambda qui définit la condition de filtrage sur chaque élément du tableau.

L’expression lambda ne doit avoir qu’un seul argument spécifié dans la syntaxe suivante :

<arg> [ <datatype> ] -> <expr>
Copy

Renvoie

Le type de retour de cette fonction est un tableau du même type que le tableau d’entrée. Le tableau renvoyé contient les éléments pour lesquels la condition de filtrage renvoie TRUE.

Si l’un des deux arguments est NULL, la fonction renvoie NULL sans signaler d’erreur.

Notes sur l’utilisation

  • Lorsque le type de données de l’argument lambda est explicitement spécifié, l’élément du tableau est contraint de se convertir dans le type spécifié avant l’invocation de lambda. Pour des informations sur la coercition ou contrainte de conversion, voir Conversion de type de données.

  • Si la condition de filtrage est évaluée sur NULL, l’élément de tableau correspondant est filtré.

Exemples

Les exemples suivants utilisent la fonction FILTER.

Filtre des éléments d’un tableau supérieurs à une valeur

Utilisez la fonction FILTER pour renvoyer les objets d’un tableau dont la valeur est supérieure ou égale à 50 :

SELECT FILTER(
  [
    {'name':'Pat', 'value': 50},
    {'name':'Terry', 'value': 75},
    {'name':'Dana', 'value': 25}
  ],
  a -> a:value >= 50) AS "Filter >= 50";
Copy
+----------------------+
| Filter >= 50         |
|----------------------|
| [                    |
|   {                  |
|     "name": "Pat",   |
|     "value": 50      |
|   },                 |
|   {                  |
|     "name": "Terry", |
|     "value": 75      |
|   }                  |
| ]                    |
+----------------------+

Filtre des éléments d’un tableau qui ne sont pas NULL

Utilisez la fonction FILTER pour renvoyer les éléments d’un tableau qui ne sont pas NULL :

SELECT FILTER([1, NULL, 3, 5, NULL], a -> a IS NOT NULL) AS "Not NULL Elements";
Copy
+-------------------+
| Not NULL Elements |
|-------------------|
| [                 |
|   1,              |
|   3,              |
|   5               |
| ]                 |
+-------------------+

Filtre des éléments de tableau d’une table qui sont supérieurs ou égaux à une valeur

Supposons que vous disposiez d’une table nommée orders avec les colonnes order_id, order_date et order_detail. La colonne order_detail est un tableau contenant les articles, la quantité achetée et le sous-total. La table contient deux lignes de données. L’instruction SQL suivante crée cette table et insère les lignes :

CREATE OR REPLACE TABLE orders AS
  SELECT 1 AS order_id, '2024-01-01' AS order_date, [
    {'item':'UHD Monitor', 'quantity':3, 'subtotal':1500},
    {'item':'Business Printer', 'quantity':1, 'subtotal':1200}
  ] AS order_detail
  UNION SELECT 2 AS order_id, '2024-01-02' AS order_date, [
    {'item':'Laptop', 'quantity':5, 'subtotal':7500},
    {'item':'Noise-canceling Headphones', 'quantity':5, 'subtotal':1000}
  ] AS order_detail;

SELECT * FROM orders;
Copy
+----------+------------+-------------------------------------------+
| ORDER_ID | ORDER_DATE | ORDER_DETAIL                              |
|----------+------------+-------------------------------------------|
|        1 | 2024-01-01 | [                                         |
|          |            |   {                                       |
|          |            |     "item": "UHD Monitor",                |
|          |            |     "quantity": 3,                        |
|          |            |     "subtotal": 1500                      |
|          |            |   },                                      |
|          |            |   {                                       |
|          |            |     "item": "Business Printer",           |
|          |            |     "quantity": 1,                        |
|          |            |     "subtotal": 1200                      |
|          |            |   }                                       |
|          |            | ]                                         |
|        2 | 2024-01-02 | [                                         |
|          |            |   {                                       |
|          |            |     "item": "Laptop",                     |
|          |            |     "quantity": 5,                        |
|          |            |     "subtotal": 7500                      |
|          |            |   },                                      |
|          |            |   {                                       |
|          |            |     "item": "Noise-canceling Headphones", |
|          |            |     "quantity": 5,                        |
|          |            |     "subtotal": 1000                      |
|          |            |   }                                       |
|          |            | ]                                         |
+----------+------------+-------------------------------------------+

Utilisez la fonction FILTER pour renvoyer les commandes dont les sous-totaux sont supérieurs ou égaux à 1 500 :

SELECT order_id,
       order_date,
       FILTER(o.order_detail, i -> i:subtotal >= 1500) ORDER_DETAIL_GT_EQUAL_1500
  FROM orders o;
Copy
+----------+------------+----------------------------+
| ORDER_ID | ORDER_DATE | ORDER_DETAIL_GT_EQUAL_1500 |
|----------+------------+----------------------------|
|        1 | 2024-01-01 | [                          |
|          |            |   {                        |
|          |            |     "item": "UHD Monitor", |
|          |            |     "quantity": 3,         |
|          |            |     "subtotal": 1500       |
|          |            |   }                        |
|          |            | ]                          |
|        2 | 2024-01-02 | [                          |
|          |            |   {                        |
|          |            |     "item": "Laptop",      |
|          |            |     "quantity": 5,         |
|          |            |     "subtotal": 7500       |
|          |            |   }                        |
|          |            | ]                          |
+----------+------------+----------------------------+