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.