- 类别:
半结构化和结构化数据函数 (高阶)
FILTER¶
基于 Lambda 表达式中的逻辑筛选 数组。
语法¶
FILTER( <array> , <lambda_expression> )
实参¶
array
包含要筛选的元素的数组。这可以是半结构化数组,也可以是结构化数组。
lambda_expression
定义每个数组元素上筛选条件的 Lambda 表达式。
Lambda 表达式必须仅指定一个实参,语法如下:
<arg> [ <datatype> ] -> <expr>
返回¶
此函数的返回类型是与输入数组具有相同类型的数组。返回的数组包含筛选条件返回 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";
+----------------------+
| 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";
+-------------------+
| Not NULL Elements |
|-------------------|
| [ |
| 1, |
| 3, |
| 5 |
| ] |
+-------------------+
筛选表中大于或等于某个值的数组元素¶
假设您有一个名为 orders
的表,包含 order_id
、order_date
和 order_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;
+----------+------------+--------------------------------------------+
| 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;
+----------+------------+----------------------------+
| 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 |
| | | } |
| | | ] |
+----------+------------+----------------------------+