Problém:
Chtěli byste zřetězit hodnoty NULL s hodnotami řetězců z jiného sloupce na serveru SQL.
Příklad:
Naše databáze obsahuje tabulku s názvem children s údaji v následujících sloupcích:id (primární klíč), first_name , prostřední_jméno a last_name .
| id | first_name | prostřední_jméno | last_name |
|---|---|---|---|
| 1 | Linda | NULL | Jackson |
| 2 | Marie | Alice | Thomson |
| 3 | NULL | Steven | NULL |
| 4 | NULL | NULL | Hnědá |
Chceme zobrazit křestní jméno z jednoho sloupce, prostřední jméno z dalšího sloupce a příjmení z posledního sloupce jako jeden řetězec, i když jeden ze sloupců obsahuje NULL.
Řešení 2:
Použijeme CONCAT() funkce. Zde je dotaz, který byste napsali:
SELECT CONCAT(first_name, middle_name, last_name) AS name FROM children;
Zde je výsledek:
| name |
|---|
| LindaJackson |
| MaryAliceThomson |
| Steven |
| Hnědá |
Diskuse:
Použijte CONCAT() funkce ke zřetězení řetězcových hodnot z výrazů nebo sloupců obsahujících NULL. Tato funkce vezme seznam řetězců (nebo NULL) a zobrazí všechny tyto hodnoty v jednom řetězci. Mezi hodnotami není žádný oddělovač, takže výsledky (jako v našem příkladu) nemusí být formátovány tak, jak byste očekávali. Jak to můžeme napravit? Podívejte se na další CONCAT() dotaz:
Řešení 2:
Zde je další možnost dotazu:
SELECT CONCAT(first_name,' ' , middle_name, ' ',last_name) AS name FROM children;
Zde je výsledek:
| name |
|---|
| Linda Jackson |
| Mary Alice Thomson |
| Steven |
| Hnědá |
Tato funkce nyní kromě řetězcových hodnot zabírá také nějaké mezery (umístěné mezi zřetězenými hodnotami). To odděluje jednu část jména od druhé. Ale jak vidíme, toto řešení také není ideální; celá jména bez druhých jmen mají mezeru navíc, zatímco záznamy s pouze jedním jménem mají mezery dvě navíc.
V tomto případě CONCAT_WS() funkce je lepší řešení.
Řešení 3:
CONCAT_WS() funkce přebírá další první argument:znak, který slouží jako oddělovač mezi řetězci. Zde je dotaz:
SELECT
CONCAT_WS(' ' , first_name, middle_name, last_name) AS name
FROM children;
A výsledek:
| name |
|---|
| Linda Jackson |
| Mary Alice Thomson |
| Steven |
| Hnědá |
Tento dotaz zobrazí celá jména dětí bez jakýchkoli nepotřebných mezer.