Funkce ve WHERE a ORDER BY
Funkce nejsou jen pro SELECT. Můžete je použít všude, kde může být hodnota, tedy i ve WHERE a v ORDER BY. Kteří zákazníci se zaregistrovali v roce 2024?
SELECT jmeno, registrace
FROM zakaznici
WHERE strftime('%Y', registrace) = '2024';| jmeno | registrace |
|---|---|
| Tomáš Veselý | 2024-01-08 |
| Klára Horáková | 2024-03-19 |
| Matěj Němec | 2024-05-27 |
| Natálie Marková | 2024-08-14 |
| Vojtěch Pokorný | 2024-11-30 |
SQLite pro každý řádek spočítá funkci a pak zkontroluje podmínku. Tady by stejné zákazníky našlo i LIKE '2024-%', ale pomocí funkcí se můžete zeptat na kteroukoli část hodnoty a z podmínky je hned jasné, o co jde: strftime('%m', registrace) = '03' najde zákazníky, kteří se zaregistrovali v březnu kteréhokoli roku, a LENGTH(jmeno) > 13 ty s dlouhým jménem.
Typická chyba: porovnání výsledku strftime s číslem. WHERE strftime('%Y', registrace) = 2024 nenajde nic, a dokonce ani neskončí chybou. strftime vrací text, '2024', a ten se pro SQLite číslu 2024 nerovná: text a číslo jsou dva různé druhy hodnot. Porovnávejte ho proto s textem v apostrofech. Totéž platí pro SUBSTR, jehož výsledek je také text.
Funkce také pomohou porovnat texty, u kterých nevíte, jak jsou napsané: WHERE LOWER(zanr) = 'rpg' najde hry žánru RPG, ať je žánr napsaný jakkoli. (U textů s diakritikou to kvůli omezení LOWER, o kterém už víte, spolehlivě nefunguje.)
V ORDER BY řadí funkce řádky podle vypočtené hodnoty. Tady od nejkratšího jména:
SELECT jmeno, LENGTH(jmeno) AS znaku
FROM zakaznici
ORDER BY LENGTH(jmeno), id
LIMIT 3;| jmeno | znaku |
|---|---|
| Eva Novotná | 11 |
| Matěj Němec | 11 |
| Filip Beneš | 11 |
Jak už víte, ORDER BY může použít i alias sloupce: ORDER BY znaku, id řadí stejně. Ve WHERE většina databází aliasy nedovolí, protože podmínky kontroluje dřív, než spočítá sloupce výsledku. SQLite je benevolentní a dovolí je, ale ve WHERE je lepší napsat celou funkci znovu, aby vaše dotazy fungovaly i v jiných databázích.
Jak psát:
Pokyny
Obchod plánuje vánoční sezonu. Ukažte ID a datum objednávek zadaných v prosinci kteréhokoli roku, seřazené podle data:
| id | datum |
|---|---|
| 13 | 2024-12-05 |
| 14 | 2024-12-20 |
| 15 | 2024-12-23 |
| 29 | 2025-12-12 |
| 30 | 2025-12-22 |
Pod tím ukažte tři nejdelší komentáře z recenzí a jejich délku jako znaku: nejdelší jako první, komentáře se stejnou délkou podle abecedy:
| komentar | znaku |
|---|---|
| Nejlepší RPG, jaké jsem za poslední roky hrál! | 46 |
| Skvělý příběh, jen trochu dlouhý. | 33 |
| Stojí za každou korunu. | 23 |
Začněte programovat zdarma
9/10