Probleem:
U wilt NULL's samenvoegen met tekenreekswaarden uit een andere kolom in SQL Server.
Voorbeeld:
Onze database heeft een tabel met de naam children
met gegevens in de volgende kolommen:id (primaire sleutel), voornaam , middle_name , en achternaam .
id | voornaam | middle_name | achternaam |
---|---|---|---|
1 | Linda | NULL | Jackson |
2 | Maria | Alice | Thomson |
3 | NULL | Steven | NULL |
4 | NULL | NULL | Bruin |
We willen de voornaam van de ene kolom, de middelste naam van de volgende kolom en de achternaam van de laatste kolom als één tekenreeks weergeven, zelfs als een van de kolommen een NULL opslaat.
Oplossing 2:
We gebruiken de CONCAT()
functie. Dit is de vraag die je zou schrijven:
SELECT CONCAT(first_name, middle_name, last_name) AS name FROM children;
Hier is het resultaat:
naam |
---|
LindaJackson |
MaryAliceThomson |
Steven |
Bruin |
Discussie:
Gebruik de CONCAT()
functie om tekenreekswaarden samen te voegen uit expressies of kolommen die een NULL bevatten. Deze functie neemt een lijst met tekenreeksen (of NULL's) en geeft al deze waarden in één tekenreeks weer. Er is geen scheidingsteken tussen de waarden, dus de resultaten (zoals in ons voorbeeld) zijn mogelijk niet opgemaakt zoals u zou verwachten. Hoe kunnen we dit corrigeren? Kijk naar een andere CONCAT()
vraag:
Oplossing 2:
Hier is nog een vraagoptie:
SELECT CONCAT(first_name,' ' , middle_name, ' ',last_name) AS name FROM children;
Hier is het resultaat:
naam |
---|
Linda Jackson |
Mary Alice Thomson |
Steven |
Bruin |
Nu neemt deze functie, afgezien van stringwaarden, ook enkele spaties in (geplaatst tussen de aaneengeschakelde waarden). Dit scheidt het ene deel van de naam van het andere. Maar zoals we zien, is deze oplossing ook niet ideaal; volledige namen zonder middelste namen hebben een extra spatie, terwijl de records met slechts één naam twee extra spaties hebben.
In dit geval is de CONCAT_WS()
functie is de betere oplossing.
Oplossing 3:
De CONCAT_WS()
functie heeft een extra eerste argument nodig:een teken dat dient als scheidingsteken tussen strings. Dit is de vraag:
SELECT CONCAT_WS(' ' , first_name, middle_name, last_name) AS name FROM children;
En het resultaat:
naam |
---|
Linda Jackson |
Mary Alice Thomson |
Steven |
Bruin |
Deze zoekopdracht toont de volledige namen van de kinderen, zonder onnodige spaties.