카테고리:

반정형 및 정형 데이터 함수 (상위 순위)

FILTER

Lambda 식의 논리에 따라 배열 을 필터링합니다.

참고 항목:

Snowflake 고차 함수를 사용하여 데이터에 Lambda 함수 사용

구문

FILTER( <array> , <lambda_expression> )
Copy

인자

array

필터링할 요소가 포함된 배열입니다. 배열은 반정형 또는 정형일 수 있습니다.

lambda_expression

각 배열 요소의 필터 조건을 정의하는 Lambda 식 입니다.

다음 구문에서는 Lambda 식에 1개의 인자만 지정해야 합니다.

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

값보다 크거나 같은 테이블의 배열 요소를 필터링합니다.

열이 order_id, order_date, order_detail 인 이름이 orders 인 테이블이 있다고 가정해 보겠습니다. 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-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                      |
|          |            |   }                                       |
|          |            | ]                                         |
+----------+------------+-------------------------------------------+

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