Článek přečtěte do 2 min.

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)