Náhrada NULL: COALESCE
Víte, že NULL znamená žádnou hodnotu. Z toho plyne něco, na co se snadno zapomíná: výpočet s NULL dá NULL. Pět plus něco neznámého je neznámé a text spojený s ničím také. V tomto seznamu zákazníků je to problém, protože město Anny Kučerové je NULL:
SELECT jmeno, 'Město: ' || mesto AS info
FROM zakaznici
WHERE id BETWEEN 4 AND 6;| jmeno | info |
|---|---|
| Lukáš Procházka | Město: Ostrava |
| Anna Kučerová | NULL |
| Tomáš Veselý | Město: Brno |
Nezmizelo jen město, ale celý text: ve sloupci info má Anna Kučerová NULL. Stejně to dopadne s +, -, * a / a většina funkcí dá pro NULL zase NULL, jak jste viděli u LENGTH.
Napraví to funkce COALESCE. Vezme libovolný počet argumentů a vrátí první z nich, který není NULL. COALESCE(mesto, 'neznámé') je tedy město, když ho zákazník má, a text 'neznámé', když ne:
SELECT jmeno, 'Město: ' || COALESCE(mesto, 'neznámé') AS info
FROM zakaznici
WHERE id BETWEEN 4 AND 6;| jmeno | info |
|---|---|
| Lukáš Procházka | Město: Ostrava |
| Anna Kučerová | Město: neznámé |
| Tomáš Veselý | Město: Brno |
S více argumenty je COALESCE zkouší jeden po druhém: COALESCE(a, b, 'nic') je a, pokud má a hodnotu, jinak b, pokud ji má b, a jinak 'nic'.
SQLite má také IFNULL(x, y), které dělá totéž s právě dvěma argumenty. COALESCE patří do standardního SQL a funguje ve všech databázích, proto ho používá i tento kurz. Totéž byste mohli napsat i pomocí CASE WHEN mesto IS NULL THEN … ELSE mesto END, ale COALESCE je mnohem kratší.
Nahrazujte NULL jen v tom, co dotaz ukazuje. V tabulce říká NULL něco pravdivého, totiž že obchod město nezná, a vymyšlená hodnota by to zakryla. A dejte pozor, aby náhrada dávala smysl: chybějící číslo není vždycky 0.
Typická chyba: text náhrady bez apostrofů. COALESCE(mesto, nezname) hledá sloupec nezname a skončí chybou no such column: nezname. Text patří vždycky do apostrofů: COALESCE(mesto, 'neznámé').
Jak psát:
Pokyny
Ukažte název každé hry a datum jejího vydání jako datum_vydani; u her, které ještě nevyšly, místo něj napište připravujeme. Hry seřaďte podle sloupce vydano a pak podle názvu, aby byly ty nevydané na začátku:
| nazev | datum_vydani |
|---|---|
| Mystery Manor | připravujeme |
| Robot Rebellion | připravujeme |
| Cube Logic | 2020-02-11 |
| … | … |
Pod tím ukažte každou recenzi hry Dragon Forge (hra_id 1) jako jeden řádek textu, shrnuti: hvězdičky, /5: a komentář, třeba 4/5: Skvělý příběh, jen trochu dlouhý. U recenze bez komentáře napište místo něj (bez komentáře). Recenze seřaďte podle zakaznik_id:
| shrnuti |
|---|
| 4/5: Skvělý příběh, jen trochu dlouhý. |
| 5/5: Nejlepší RPG, jaké jsem za poslední roky hrál! |
| 3/5: Na začátku moc těžké. |
| 5/5: (bez komentáře) |
Začněte programovat zdarma
6/10