- 카테고리:
반정형 및 정형 데이터 함수 (상위 순위)
TRANSFORM¶
람다 식의 논리에 따라 배열 을 변환합니다.
구문¶
TRANSFORM( <array> , <lambda_expression> )
인자¶
array
변환할 요소가 포함된 배열입니다. 배열은 반정형 또는 정형일 수 있습니다.
lambda_expression
각 배열 요소의 변환 논리를 정의하는 람다 식 입니다.
다음 구문에서는 Lambda 식에 1개의 인자만 지정해야 합니다.
<arg> [ <datatype> ] -> <expr>
반환¶
이 함수의 반환 타입은 람다 식 결과의 반정형 배열 또는 정형 배열입니다.
두 인자 중 하나가 NULL이면 함수는 오류를 보고하지 않고 NULL을 반환합니다.
사용법 노트¶
Lambda 인자의 데이터 타입이 명시적으로 지정된 경우, Lambda를 호출하기 전에 배열 요소가 지정된 형식으로 강제 변환됩니다. 강제 변환에 대한 자세한 내용은 데이터 타입 변환 섹션을 참조하십시오.
람다 인자에 대해 데이터 타입이 지정되지 않은 경우 해당 데이터 타입은 다음과 같이 입력 배열에서 파생됩니다.
입력 배열이 반정형인 경우, 람다 인자의 데이터 타입은 VARIANT 입니다.
입력 배열이 정형 경우, 람다 인자의 데이터 타입은 배열 요소의 데이터 타입입니다.
반정형 배열 입력의 경우 반정형 배열이 반환됩니다. 정형 배열 입력의 경우, 람다 식 결과 타입의 정형 배열이 반환됩니다.
예¶
다음 예제에서는 TRANSFORM 함수를 사용합니다.
배열의 각 요소에 값을 곱합니다.¶
TRANSFORM 함수를 사용하여 배열의 각 요소에 2를 곱합니다.
SELECT TRANSFORM([1, 2, 3], a INT -> a * 2) AS "Multiply by Two";
+-----------------+
| Multiply by Two |
|-----------------|
| [ |
| 2, |
| 4, |
| 6 |
| ] |
+-----------------+
이 예는 이전 예와 동일하지만 INT 타입의 정형 배열을 지정합니다.
SELECT TRANSFORM([1, 2, 3]::ARRAY(INT), a INT -> a * 2) AS "Multiply by Two (Structured)";
+------------------------------+
| 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";
+-----------------------+
| 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;
+----------+------------+-------------------------------------------+
| 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;
+----------+------------+-------------------------------------------+
| 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;
+----------+------------+-------------------------------------------+
| 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 |
| | | } |
| | | ] |
+----------+------------+-------------------------------------------+