Problem:
Chcesz połączyć wartości NULL z wartościami łańcuchowymi z innej kolumny w SQL Server.
Przykład:
Nasza baza danych zawiera tabelę o nazwie children
z danymi w następujących kolumnach:id (klucz podstawowy), imię , drugie imię i nazwisko .
id | imię | drugie imię | nazwisko |
---|---|---|---|
1 | Linda | NULL | Jackson |
2 | Maryi | Alicja | Thomson |
3 | NULL | Steven | NULL |
4 | NULL | NULL | Brązowy |
Chcemy wyświetlić imię z jednej kolumny, drugie imię z następnej kolumny i nazwisko z ostatniej kolumny jako jeden ciąg, nawet jeśli jedna z kolumn przechowuje NULL.
Rozwiązanie 2:
Użyjemy CONCAT()
funkcjonować. Oto zapytanie, które napiszesz:
SELECT CONCAT(first_name, middle_name, last_name) AS name FROM children;
Oto wynik:
nazwa |
---|
LindaJackson |
MaryAliceThomson |
Steven |
Brązowy |
Dyskusja:
Użyj CONCAT()
funkcja do łączenia wartości ciągu z wyrażeń lub kolumn zawierających wartość NULL. Ta funkcja pobiera listę ciągów (lub wartości NULL) i wyświetla wszystkie te wartości w jednym ciągu. Nie ma separatora między wartościami, więc wyniki (jak w naszym przykładzie) mogą nie być sformatowane zgodnie z oczekiwaniami. Jak możemy to naprawić? Spójrz na inną CONCAT()
zapytanie:
Rozwiązanie 2:
Oto kolejna opcja zapytania:
SELECT CONCAT(first_name,' ' , middle_name, ' ',last_name) AS name FROM children;
Oto wynik:
nazwa |
---|
Linda Jackson |
Mary Alice Thomson |
Steven |
Brązowy |
Teraz, oprócz wartości łańcuchowych, ta funkcja zajmuje również kilka spacji (umieszczanych między połączonymi wartościami). To oddziela jedną część nazwy od drugiej. Ale jak widzimy, to rozwiązanie również nie jest idealne; pełne imiona bez drugiego imienia mają dodatkową spację, podczas gdy rekordy z tylko jednym imieniem mają dwie dodatkowe spacje.
W tym przypadku CONCAT_WS()
funkcja jest lepszym rozwiązaniem.
Rozwiązanie 3:
CONCAT_WS()
funkcja przyjmuje dodatkowy pierwszy argument:znak, który służy jako separator między ciągami. Oto zapytanie:
SELECT CONCAT_WS(' ' , first_name, middle_name, last_name) AS name FROM children;
A wynik:
nazwa |
---|
Linda Jackson |
Mary Alice Thomson |
Steven |
Brązowy |
To zapytanie wyświetla pełne imiona dzieci bez zbędnych spacji.