类别:

半结构化和结构化数据函数 (高阶)

FILTER

基于 Lambda 表达式中的逻辑筛选 数组

另请参阅:

使用 Snowflake 高阶函数过滤和转换数据

语法

FILTER( <array> , <lambda_expression> )
Copy

实参

array

包含要筛选的元素的数组。这可以是半结构化数组,也可以是结构化数组。

lambda_expression

定义每个数组元素上筛选条件的 Lambda 表达式

Lambda 表达式必须仅指定一个实参,语法如下:

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

返回

此函数的返回类型是与输入数组具有相同类型的数组。返回的数组包含筛选条件返回 TRUE 的元素。

如果任一实参为 NULL,则此函数返回 NULL 且不报告错误。

使用说明

  • 显式指定 Lambda 实参的数据类型时,在 Lambda 调用之前,数组元素将被强制转换为指定类型。有关强制转换的信息,请参阅 数据类型转换

  • 如果筛选条件计算结果为 NULL,则筛选掉相应的数组元素。

示例

以下示例使用 FILTER 函数。

数组元素大于某个值的筛选器

使用 FILTER 函数,返回数组中值大于或等于 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      |
|   }                  |
| ]                    |
+----------------------+

非 NULL 数组元素的筛选器

使用 FILTER 函数返回非 NULL 的数组元素:

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

筛选表中大于或等于某个值的数组元素

假设您有一个名为 orders 的表,包含 order_idorder_dateorder_detail 列。order_detail 列是包含行项目、其购买数量和小计的数组。该表包含两行数据。以下 SQL 语句会创建此表并插入行:

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-cancelling Headphones', 'quantity':5, 'subtotal':1000}
  ];

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-cancelling Headphones", |
|          |            |     "quantity": 5,                         |
|          |            |     "subtotal": 1000                       |
|          |            |   }                                        |
|          |            | ]                                          |
+----------+------------+--------------------------------------------+

使用 FILTER 函数,返回小计大于或等于 1500 的订单:

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       |
|          |            |   }                        |
|          |            | ]                          |
+----------+------------+----------------------------+
语言: 中文