PostgreSQL

Príklady PostgreSQL UNNEST

Príklady PostgreSQL UNNEST
Stĺpec v PostgreSQL môžete určiť iba ako pole vhodných typov údajov. Všetky možnosti sú vstavané, používateľom určené a neodňateľné dátové typy. Okrem toho sú polia v PostgreSQL veľmi dôležité. Dozvedeli ste sa o poliach v PostgreSQL, vrátane toho, ako konštruovať, dopytovať sa a niekedy dokonca generovať polia pomocou metódy ARRAY. Sú však chvíle, kedy by som to chcel urobiť naopak a previesť pole PostgreSQL na riadky. Existuje mnoho dôvodov, prečo by ste to chceli urobiť. Chvíľu povedzme, že hľadáte spojenie dvoch polí. V PostgreSQL to operátor INTERSECT dokáže efektívne pre dve rôzne sady riadkov. Neexistuje však žiadny náprotivok pre polia. Rovnako operátor UNION spája 2 páry riadkov; pre polia však nie je nič porovnateľné. Tajomstvom toho všetkého sa javí metóda UNNEST. Pri konzumácii UNNEST musíte byť opatrní, pretože (rovnako ako vo väčšine počítačových systémov) by PostgreSQL urobil čokoľvek, čo mu nariadite, nie presne to, čo chcete.

Ak chcete tento koncept úplne rozpracovať, otvorte vo svojom systéme nainštalovaný shell príkazového riadku PostgreSQL. Ak nechcete začať pracovať s predvolenými možnosťami, zadajte názov servera, názov databázy, číslo portu, používateľské meno a heslo pre konkrétneho používateľa. Ak chcete pracovať s predvolenými parametrami, nechajte všetky možnosti prázdne a stlačte kláves Enter every option. Teraz je váš shell príkazového riadku pripravený pracovať.

Príklad 01: Definujte údaje typu poľa

Pred prechodom na úpravu hodnôt poľa v databáze je dobré preštudovať si základy. Toto je spôsob, ako určiť zoznam typov textu. Môžete vidieť, že výstup zobrazil zoznam typov textu pomocou klauzuly SELECT.

>> SELECT 'Aqsa, Raza, Saeed' :: text [];

Počas písania dotazu musí byť definovaný typ údajov. PostgreSQL nerozpozná typ údajov, ak sa zdá, že ide o reťazec. Prípadne by sme mohli použiť formát ARRAY [] na jeho zadanie ako typu reťazca, ako je zobrazené nižšie v dotaze. Z výstupu uvedeného nižšie môžete vidieť, že údaje boli načítané ako typ poľa pomocou dotazu SELECT.

>> SELECT ARRAY ['Aqsa', 'Raza', 'Saeed'];

Keď pri použití klauzuly FROM vyberiete rovnaké údaje poľa s dotazom SELECT, nefunguje to tak, ako by malo. Vyskúšajte napríklad nasledujúci dotaz klauzuly FROM v shelli. Skontrolujete, či nepríde k chybe. Je to preto, lebo klauzula SELECT FROM predpokladá, že načítané údaje sú pravdepodobne skupinou riadkov alebo niektorými bodmi z tabuľky.

>> SELECT * FROM ARRAY ['Aqsa', 'Raza', 'Saeed'];

Príklad 02: Prevod poľa do riadkov

ARRAY [] je funkcia, ktorá vracia atómovú hodnotu. Vo výsledku sa to hodí iba k SELECT a nie k doložke FROM, pretože naše údaje neboli vo forme „riadku“. Preto sa vo vyššie uvedenom príklade vyskytla chyba. Týmto spôsobom je možné pomocou funkcie UNNEST prevádzať polia na riadky, zatiaľ čo váš dotaz nefunguje s klauzulou.

>> ZVOLIŤ NEZNÁM (ARRAY ['Aqsa', 'Raza', 'Saeed']);

Príklad 03: Prevod riadkov do poľa

Ak chcete znova previesť riadky do poľa, musíme na to definovať konkrétny dotaz v rámci dotazu. Tu musíte použiť dva dotazy SELECT. Interný výberový dotaz prevádza pole na riadky pomocou funkcie UNNEST. Zatiaľ čo externý dotaz SELECT opäť prevádza všetky tieto riadky do jedného poľa, ako je to znázornené na obrázku citovanom nižšie. Pozor; v externom dotaze SELECT musíte použiť menšie pravopisné slová 'array'.

>> SELECT array (SELECT UNNEST (ARRAY ['Aqsa', 'Raza', 'Saeed']));;

Príklad 04: Odstránenie duplikátov pomocou klauzuly DISTINCT

DISTINCT vám môže pomôcť extrahovať duplikáty z akejkoľvek formy údajov. Nevyhnutne si to však vyžaduje použitie riadkov ako údajov. To znamená, že táto metóda funguje pre celé čísla, text, plaváky a ďalšie dátové typy, ale polia nie sú povolené. Ak chcete odstrániť duplikáty, musíte najskôr previesť údaje typu svojho poľa do riadkov pomocou metódy UNNEST. Potom sa tieto prevedené riadky s údajmi odovzdajú do klauzuly DISTINCT. Nižšie môžete vidieť výstup, že pole bolo prevedené do riadkov, potom boli pomocou klauzule DISTINCT načítané iba odlišné hodnoty z týchto riadkov.

>> SELECT DISTINCT UNNEST ('Aqsa, Raza, Saeed, Raza, Uzma, Aqsa' :: text []);

Ak potrebujete ako výstup pole, použite v prvom dotaze SELECT funkciu array () a v nasledujúcom dotaze SELECT použite klauzulu DISTINCT. Zo zobrazeného obrázka vidíte, že výstup bol zobrazený vo forme poľa, nie v riadku. Zatiaľ čo výstup obsahuje iba odlišné hodnoty.

>> SELECT array (SELECT DISTINCT UNNEST ('Aqsa, Raza, Saeed, Raza, Uzma, Aqsa' :: text []));

Príklad 05: Odstránenie duplikátov pri použití klauzuly ORDER BY

Duplicitné hodnoty môžete tiež odstrániť z poľa typu float, ako je uvedené nižšie. Spolu s odlišným dotazom použijeme klauzulu ORDER BY na získanie výsledku v poradí zoradenia konkrétnej hodnoty. Vyskúšajte to nižšie uvedeným dotazom v prostredí príkazového riadku.

>> VYBERTE OKRESNÝ NEZNÁM ('2,85, 2.73, 2.85, 1.8, 2.73 ':: float []) OBJEDNAŤ PO 1;

Najskôr bolo pole prevedené do riadkov pomocou funkcie UNNEST; potom budú tieto riadky zoradené vzostupne pomocou klauzuly ORDER BY, ako je uvedené nižšie.

Ak chcete riadky znova previesť na pole, použite rovnaký príkaz SELECT v prostredí Shell a zároveň ho použite s malou funkciou abecedného poľa (). Môžete sa pozrieť na výstup nižšie, že pole bolo najskôr prevedené na riadky, potom boli vybrané iba odlišné hodnoty. Nakoniec budú riadky znova prevedené do poľa.

>> SELECT pole (SELECT DISTINCT UNNEST ('2,85, 2.73, 2.85, 1.8, 2.73 ':: float []));

Záver:

Nakoniec ste úspešne implementovali všetky príklady z tejto príručky. Dúfame, že pri vykonávaní metód UNNEST (), DISTINCT a array () v príkladoch nemáte problém.

Hry SuperTuxKart pre Linux
SuperTuxKart pre Linux
SuperTuxKart je vynikajúci titul navrhnutý tak, aby vám priniesol zážitok z hry Mario Kart zadarmo na vašom systéme Linux. Je to dosť náročné a zábavn...
Hry Výukový program Battle for Wesnoth
Výukový program Battle for Wesnoth
Battle for Wesnoth je jednou z najpopulárnejších open source strategických hier, ktoré si v súčasnosti môžete zahrať. Táto hra bola nielen vyvinutá ve...
Hry 0 A.D. Výukový program
0 A.D. Výukový program
Z mnohých strategických hier je tu 0 A.D. dokáže vyniknúť ako komplexný titul a veľmi hlboká, taktická hra napriek tomu, že je otvoreným zdrojom. Vývo...