Kategorien:

Funktionen für semistrukturierte und strukturierte Daten (höhere Ordnung)

FILTER

Filtert ein Array basierend auf der Logik eines Lambda-Ausdrucks.

Siehe auch:

Verwenden Sie Lambda-Funktionen auf Daten mit Snowflake Funktionen höherer Ordnung

Syntax

FILTER( <array> , <lambda_expression> )
Copy

Argumente

array

Das Array, das die zu filternden Elemente enthält. Das Feld kann semistrukturiert oder strukturiert sein.

lambda_expression

Ein Lambda-Ausdruck, der die Filterbedingung für jedes Array-Element definiert.

Der Lambda-Ausdruck darf nur ein Argument haben, das in der folgenden Syntax angegeben wird:

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

Rückgabewerte

Der Rückgabetyp dieser Funktion ist ein Array vom gleichen Typ wie das Eingabe-Array. Das zurückgegebene Array enthält die Elemente, für die Filterbedingung TRUE zurückgibt.

Wenn eines der beiden Argumente NULL ist, gibt die Funktion NULL zurück, ohne einen Fehler zu melden.

Nutzungshinweise

  • Wenn der Datentyp für das Lambda-Argument explizit angegeben ist, wird das Array-Element vor dem Lambda-Aufruf in den angegebenen Typ implizit umgewandelt (Koersion). Weitere Informationen zur Koersion finden Sie unter Datentypkonvertierung.

  • Wenn die Filterbedingung den Wert NULL ergibt, wird das entsprechende Array-Element herausgefiltert.

Beispiele

Die folgenden Beispiele verwenden die Funktion FILTER.

Filter für Array-Elemente größer als ein Wert

Verwenden Sie die Funktion FILTER, um Objekte eines Array zurückzugeben, die einen Wert größer oder gleich 50 haben:

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      |
|   }                  |
| ]                    |
+----------------------+

Filter für Array-Elemente, die nicht NULL sind

Verwenden Sie die Funktion FILTER, um Array-Elemente zurückzugeben, die nicht NULL sind:

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

Filter für Array-Elemente in einer Tabelle, die größer oder gleich einem Wert sind

Angenommen, Sie haben eine Tabelle namens orders mit den Spalten order_id, order_date und order_detail. Die Spalte order_detail ist ein Array mit den Einzelposten, deren Einkaufsmenge und der Zwischensumme. Die Tabelle enthält zwei Zeilen mit Daten. Die folgende SQL-Anweisung erstellt diese Tabelle und fügt die Zeilen ein:

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                      |
|          |            |   }                                       |
|          |            | ]                                         |
+----------+------------+-------------------------------------------+

Verwenden Sie die Funktion FILTER, um Bestellungen mit Zwischensummen größer oder gleich 1500 zurückzugeben:

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       |
|          |            |   }                        |
|          |            | ]                          |
+----------+------------+----------------------------+