카테고리:

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

TRANSFORM

람다 식의 논리에 따라 배열 을 변환합니다.

참고 항목:

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

구문

TRANSFORM( <array> , <lambda_expression> )
Copy

인자

array

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

lambda_expression

각 배열 요소의 변환 논리를 정의하는 람다 식 입니다.

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

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

반환

이 함수의 반환 타입은 람다 식 결과의 반정형 배열 또는 정형 배열입니다.

두 인자 중 하나가 NULL이면 함수는 오류를 보고하지 않고 NULL을 반환합니다.

사용법 노트

  • Lambda 인자의 데이터 타입이 명시적으로 지정된 경우, Lambda를 호출하기 전에 배열 요소가 지정된 형식으로 강제 변환됩니다. 강제 변환에 대한 자세한 내용은 데이터 타입 변환 섹션을 참조하십시오.

  • 람다 인자에 대해 데이터 타입이 지정되지 않은 경우 해당 데이터 타입은 다음과 같이 입력 배열에서 파생됩니다.

    • 입력 배열이 반정형인 경우, 람다 인자의 데이터 타입은 VARIANT 입니다.

    • 입력 배열이 정형 경우, 람다 인자의 데이터 타입은 배열 요소의 데이터 타입입니다.

  • 반정형 배열 입력의 경우 반정형 배열이 반환됩니다. 정형 배열 입력의 경우, 람다 식 결과 타입의 정형 배열이 반환됩니다.

다음 예제에서는 TRANSFORM 함수를 사용합니다.

배열의 각 요소에 값을 곱합니다.

TRANSFORM 함수를 사용하여 배열의 각 요소에 2를 곱합니다.

SELECT TRANSFORM([1, 2, 3], a INT -> a * 2) AS "Multiply by Two";
Copy
+-----------------+
| Multiply by Two |
|-----------------|
| [               |
|   2,            |
|   4,            |
|   6             |
| ]               |
+-----------------+

이 예는 이전 예와 동일하지만 INT 타입의 정형 배열을 지정합니다.

SELECT TRANSFORM([1, 2, 3]::ARRAY(INT), a INT -> a * 2) AS "Multiply by Two (Structured)";
Copy
+------------------------------+
| Multiply by Two (Structured) |
|------------------------------|
| [                            |
|   2,                         |
|   4,                         |
|   6                          |
| ]                            |
+------------------------------+

텍스트가 추가된 배열의 반환 값

TRANSFORM 함수를 사용하여 배열에 있는 각 오브젝트의 값을 반환하고 각 오브젝트에 텍스트를 추가합니다.

SELECT TRANSFORM(
  [
    {'name':'Pat', 'value': 50},
    {'name':'Terry', 'value': 75},
    {'name':'Dana', 'value': 25}
  ],
  c -> c:value || ' is the number') AS "Return Values";
Copy
+-----------------------+
| Return Values         |
|-----------------------|
| [                     |
|   "50 is the number", |
|   "75 is the number", |
|   "25 is the number"  |
| ]                     |
+-----------------------+

테이블 데이터의 배열 요소 변환

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

TRANSFORM 함수를 사용하여 orders 테이블의 각 배열에 unit_price 요소를 추가합니다.

SELECT order_id,
       order_date,
       TRANSFORM(o.order_detail, i -> OBJECT_INSERT(
         i,
         'unit_price',
         (i:subtotal / i:quantity)::NUMERIC(10,2))) ORDER_DETAIL_WITH_UNIT_PRICE
  FROM orders o;
Copy
+----------+------------+-------------------------------------------+
| ORDER_ID | ORDER_DATE | ORDER_DETAIL_WITH_UNIT_PRICE              |
|----------+------------+-------------------------------------------|
|        1 | 2024-01-01 | [                                         |
|          |            |   {                                       |
|          |            |     "item": "UHD Monitor",                |
|          |            |     "quantity": 3,                        |
|          |            |     "subtotal": 1500,                     |
|          |            |     "unit_price": 500                     |
|          |            |   },                                      |
|          |            |   {                                       |
|          |            |     "item": "Business Printer",           |
|          |            |     "quantity": 1,                        |
|          |            |     "subtotal": 1200,                     |
|          |            |     "unit_price": 1200                    |
|          |            |   }                                       |
|          |            | ]                                         |
|        2 | 2024-01-02 | [                                         |
|          |            |   {                                       |
|          |            |     "item": "Laptop",                     |
|          |            |     "quantity": 5,                        |
|          |            |     "subtotal": 7500,                     |
|          |            |     "unit_price": 1500                    |
|          |            |   },                                      |
|          |            |   {                                       |
|          |            |     "item": "Noise-canceling Headphones", |
|          |            |     "quantity": 5,                        |
|          |            |     "subtotal": 1000,                     |
|          |            |     "unit_price": 200                     |
|          |            |   }                                       |
|          |            | ]                                         |
+----------+------------+-------------------------------------------+

람다 식의 논리에서 OBJECT_DELETE 함수와 함께 TRANSFORM 함수를 사용하여 orders 테이블의 각 배열에 있는 quantity 요소를 삭제합니다.

SELECT order_id,
       order_date,
       TRANSFORM(o.order_detail, i -> OBJECT_DELETE(
         i,
         'quantity')) ORDER_DETAIL_WITHOUT_QUANTITY
  FROM orders o;
Copy
+----------+------------+-------------------------------------------+
| ORDER_ID | ORDER_DATE | ORDER_DETAIL_WITHOUT_QUANTITY             |
|----------+------------+-------------------------------------------|
|        1 | 2024-01-01 | [                                         |
|          |            |   {                                       |
|          |            |     "item": "UHD Monitor",                |
|          |            |     "subtotal": 1500                      |
|          |            |   },                                      |
|          |            |   {                                       |
|          |            |     "item": "Business Printer",           |
|          |            |     "subtotal": 1200                      |
|          |            |   }                                       |
|          |            | ]                                         |
|        2 | 2024-01-02 | [                                         |
|          |            |   {                                       |
|          |            |     "item": "Laptop",                     |
|          |            |     "subtotal": 7500                      |
|          |            |   },                                      |
|          |            |   {                                       |
|          |            |     "item": "Noise-canceling Headphones", |
|          |            |     "subtotal": 1000                      |
|          |            |   }                                       |
|          |            | ]                                         |
+----------+------------+-------------------------------------------+