- Kategorien:
Funktionen für semistrukturierte und strukturierte Daten (höhere Ordnung)
TRANSFORM¶
Transformiert ein Array basierend auf der Logik in einem Lambda-Ausdruck.
Syntax¶
TRANSFORM( <array> , <lambda_expression> )
Argumente¶
array
Das Array, das die zu transformierenden Elemente enthält. Das Feld kann semistrukturiert oder strukturiert sein.
lambda_expression
Ein Lambda-Ausdruck, der die Transformationslogik für jedes Array-Element definiert.
Der Lambda-Ausdruck darf nur ein Argument haben, das in der folgenden Syntax angegeben wird:
<arg> [ <datatype> ] -> <expr>
Rückgabewerte¶
Der Rückgabetyp dieser Funktion ist ein semistrukturiertes oder strukturiertes Array mit dem Ergebnis des Lambda-Ausdrucks.
Wenn eines der beiden Argumente NULL ist, gibt die Funktion NULL zurück, ohne einen Fehler zu melden.
Nutzungshinweise¶
Wenn der Datentyp für das Lambda-Argument explizit angegeben ist, wird das Array-Element vor dem Lambda-Aufruf in den angegebenen Typ implizit umgewandelt (Koersion). Weitere Informationen zur Koersion finden Sie unter Datentypkonvertierung.
Wenn für das Lambda-Argument kein Datentyp angegeben ist, wird sein Datentyp wie folgt aus dem Eingabe-Array abgeleitet:
Wenn das Eingabe-Array semistrukturiert ist, ist der Datentyp des Lambda-Arguments VARIANT.
Wenn das Eingabe-Array strukturiert ist, ist der Datentyp des Lambda-Arguments der Datentyp des Array-Elements.
Bei Eingabe eines semistrukturierten Arrays wird ein semistrukturiertes Array zurückgegeben. Bei Eingabe eines strukturierten Arrays wird ein strukturiertes Array vom Ergebnistyp des Lambda-Ausdrucks zurückgegeben.
Beispiele¶
Die folgenden Beispiele verwenden die Funktion TRANSFORM.
Jedes Element in einem Array mit einem Wert multiplizieren¶
Verwenden Sie die Funktion TRANSFORM, um jedes Element in einem Array mit 2 zu multiplizieren:
SELECT TRANSFORM([1, 2, 3], a INT -> a * 2) AS "Multiply by Two";
+-----------------+
| Multiply by Two |
|-----------------|
| [ |
| 2, |
| 4, |
| 6 |
| ] |
+-----------------+
Dieses Beispiel ist dasselbe wie das vorherige, aber es gibt ein strukturiertes Array vom Typ INT an:
SELECT TRANSFORM([1, 2, 3]::ARRAY(INT), a INT -> a * 2) AS "Multiply by Two (Structured)";
+------------------------------+
| Multiply by Two (Structured) |
|------------------------------|
| [ |
| 2, |
| 4, |
| 6 |
| ] |
+------------------------------+
Werte in einem Array mit hinzugefügtem Text zurückgeben¶
Verwenden Sie die Funktion TRANSFORM, um den Wert jedes Objekts in einem Array zurückzugeben, und fügen Sie jedem Objekt Text hinzu:
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" |
| ] |
+-----------------------+
Array-Elemente in Tabellendaten transformieren¶
Angenommen, Sie haben eine Tabelle namens orders
mit den Spalten order_id
, order_date
und order_detail
. Die Spalte order_detail
ist ein Array mit den Einzelposten, deren Einkaufsmenge und der Zwischensumme. Die Tabelle enthält zwei Zeilen mit Daten. Die folgende SQL-Anweisung erstellt diese Tabelle und fügt die Zeilen ein:
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 |
| | | } |
| | | ] |
+----------+------------+-------------------------------------------+
Verwenden Sie die Funktion TRANSFORM, um jedem Array in der Tabelle orders
ein Element unit_price
hinzuzufügen:
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 |
| | | } |
| | | ] |
+----------+------------+-------------------------------------------+
Verwenden Sie die Funktion TRANSFORM zusammen mit der Funktion OBJECT_DELETE in der Logik des Lambda-Ausdrucks, um das Element quantity
in jedem Array aus der Tabelle orders
zu löschen:
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 |
| | | } |
| | | ] |
+----------+------------+-------------------------------------------+