Vertica poskytuje dvě funkce, UNNEST a EXPLODE pro rozšíření polí do jednoho nebo více řádků.
Tyto funkce nabízejí stejnou funkčnost s jemnými rozdíly v syntaxi a výstupu.
Pojďme to pochopit na jednoduchém příkladu.
CREATE TABLE orders (
orderkey VARCHAR,
custkey INT,
prodkey ARRAY[VARCHAR],
orderprices ARRAY [DECIMAL (12,2)],
email_addrs ARRAY[VARCHAR]);
eonv2330=> select * from orders.
orderkey | custkey | prodkey | orderprices | email_addrs
----------+---------+------------------------+-----------------------------+------------------------------------------------
19626 | 91 | ["P1262","P68","P101"] | ["192.59","49.99","137.49"] | ["bob@example.com","robert.jones@example.com"]
25646 | 716 | ["P997","P31","P101"] | ["91.39","29.99","147.49"] | ["bob2@example.com","robert@example.com"]
25647 | 716 | ["P12"] | ["8.99"] | ["jones@example.com"]
19743 | 161 | ["P68","P101"] | ["49.99","137.49"] | ["alexjohnson@example.com"]
19888 | 241 | ["P1262","P101"] | ["197.59","142.49"] | ["jonanthan@example.com"]
V tabulce máme 3 sloupce pole. Rozšiřme 1 sloupec pole pro konkrétní klíč objednávky. Rozložit poskytuje polohu prvku v poli, zatímco unnest neposkytuje polohu prvku v poli. Unnest akceptuje jako vstup pouze sloupce pole, zatímco příkaz explode přijímá další sloupce i vstup, například orderkey v následujícím příkladu.
eonv2330=> SELECT orderkey, UNNEST (prodkey) FROM orders WHERE orderkey='19626';
orderkey | value
----------+-------
19626 | P1262
19626 | P68
19626 | P101
(3 rows)
eonv2330=> SELECT EXPLODE (orderkey, prodkey) over () FROM orders WHERE orderkey='19626';
orderkey | position | value
----------+----------+-------
19626 | 0 | P1262
19626 | 1 | P68
19626 | 2 | P101
(3 rows)
Nyní rozbalme 2 sloupce pole. Při rozbalování více než 1 sloupce pole vyžaduje rozbalení předání explode_count, počet sloupců pole, které je třeba rozložit, zatímco UNNEST ve výchozím nastavení rozbalí všechny předané sloupce do jednoho nebo více řádků
eonv2330=> SELECT EXPLODE (orderkey prodkey,orderprices USING PARAMETERS explode_count=2,skip_partitioning=true) FROM orders WHERE orderkey='19626';
+----------+-------------+-------------+-----------------+-----------------+
| orderkey | pos_prodkey | val_prodkey | pos_orderprices | val_orderprices |
+----------+-------------+-------------+-----------------+-----------------+
| 19626 | 0 | P1262 | 0 | 192.59 |
| 19626 | 0 | P1262 | 1 | 49.99 |
| 19626 | 0 | P1262 | 2 | 137.49 |
| 19626 | 1 | P68 | 0 | 192.59 |
| 19626 | 1 | P68 | 1 | 49.99 |
| 19626 | 1 | P68 | 2 | 137.49 |
| 19626 | 2 | P101 | 0 | 192.59 |
| 19626 | 2 | P101 | 1 | 49.99 |
| 19626 | 2 | P101 | 2 | 137.49 |
+----------+-------------+-------------+-----------------+-----------------+
(9 rows)
eonv2330=> SELECT orderkey,unnest (prodkey,orderprices) FROM orders WHERE orderkey='19626';
+----------+-------------+-----------------+
| orderkey | val_prodkey | val_orderprices |
+----------+-------------+-----------------+
| 19626 | P1262 | 192.59 |
| 19626 | P1262 | 49.99 |
| 19626 | P1262 | 137.49 |
| 19626 | P68 | 192.59 |
| 19626 | P68 | 49.99 |
| 19626 | P68 | 137.49 |
| 19626 | P101 | 192.59 |
| 19626 | P101 | 49.99 |
| 19626 | P101 | 137.49 |
+----------+-------------+-----------------+
(9 rows)