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.