3.1 Funkcie pre textové reťazce
Funkcie v SQL
Funkcie už poznáme z programovania, v prípade databáz ich môžeme rozdeliť na dva typy:
- funkcie nad jedným riadkom - každý riadok je samostatný vstup do funkcie a pre každý takýto riadok je samostatný výstup;
- funkcie nad viacerými riadkami (agregačné funkcie) - viac riadkov vstupuje do funkcie a výstup je jeden spoločný (ako napríklad počet, priemer, maximum).
Ak chceme funkcie alebo výrazy skúšať „len tak bez tabuliek“, v Oracle SQL je nutné použiť fiktívnu tabuľku DUAL, napríklad:
SELECT 2+5 FROM DUAL;
Funkcie meniace veľkosť písmen
Funkcie LOWER() a UPPER() menia všetky písmená na malé a veľké. V niektorých dialektoch SQL (napríklad v Oracle a PostgreSQL) je dostupná aj funkcia INITCAP(), ktorá mení prvé písmená každého slova na veľké a ostatné písmená na malé. Táto funkcia však nie je dostupná v MySQL/MariaDB.
Prehľad funkcií pre prácu s textom
Funkciu pre spájanie textov CONCAT() už poznáme, no k dispozícii máme aj ďalšie zaujímavé funkcie, ako napríklad:
- SUBSTR({text}, {začiatok}): z textu vráti časť začínajúcu znakom č. {začiatok} (čísluje sa od 1),
- v Oracle a MariaDB môže {začiatok} byť záporným číslom - vtedy vráti posledné znaky (od konca);
- SUBSTR({text}, {začiatok}, {počet}): z textu vráti zadaný počet znakov počnúc znakom č. {začiatok};
- LENGTH({text}): vráti dĺžku textu, teda počet jeho znakov;
-- posledné dve písmená z mena
SELECT DISTINCT
first_name AS meno,
SUBSTR(first_name, -2), -- nefunguje v PostgreSQL
SUBSTR(first_name, LENGTH(first_name) - 1) -- funguje všade
FROM employees
ORDER BY first_name;
- INSTR({text}, {reťazec}): v texte hľadá reťazec a vráti jeho prvú pozíciu (od 1) - ak nie je, tak vráti 0,
- v PostgreSQL: STRPOS({text}, {reťazec});
-- zoznam zamestnancov, ktorí majú v mene alebo priezvisku medzeru
SELECT
first_name AS meno,
last_name AS priezvisko
FROM employees
-- WHERE INSTR(CONCAT(first_name, last_name), ' ') > 0 -- MariaDB
WHERE STRPOS(first_name || last_name, ' ') > 0 -- PostgreSQL
ORDER BY last_name, first_name;
- LPAD/RPAD({text}, {dĺžka}, {znak}): text skráti na požadovanú dĺžku alebo ho zľava/sprava doplní zadaným znakom do požadovanej dĺžky;
- TRIM(LEADING/TRAILING/BOTH {znak} FROM {text}): odstráni zadaný znak zo začiatku/konca/oboch strán textu - obvykle odstraňujeme medzeru,
- v PostgreSQL: môžeme uviesť aj viac znakov, odstraňuje každý z nich,
- v MariaDB: namiesto znaku môžeme uviesť postupnosť znakov (reťazec), odstraňuje ho ako celok;
- REPLACE({text}, {čo}, {čím}): v texte hľadá reťazec {čo} a vymení ho za reťazec {čím}.
-- malé prvé 4 písmená z priezviska
-- ak je kratšie, zľava doplní _
SELECT DISTINCT
last_name,
LOWER(LPAD(REPLACE(last_name, ' ', ''), 4, '_')) AS priezvisko
FROM employees
ORDER BY priezvisko;
-- vytvorenie loginu pre zamestnancov
SELECT
last_name,
first_name,
LOWER(CONCAT(RPAD(REPLACE(last_name, ' ', ''), 4, '_'), SUBSTR(first_name, 1, 4))) AS login
FROM employees
ORDER BY last_name, first_name;