Проблем:
Искате да свържете NULL числа със стойности на низове от различна колона в SQL Server.
Пример:
Нашата база данни има таблица с име children с данни в следните колони:id (първичен ключ), first_name , средно_име и фамилно_име .
| id | first_name | междинно_име | фамилно_име |
|---|---|---|---|
| 1 | Линда | NULL | Джаксън |
| 2 | Мери | Алиса | Томсън |
| 3 | NULL | Стивън | NULL |
| 4 | NULL | NULL | Кафяв |
Искаме да покажем първото име от една колона, средното име от следващата колона и фамилното име от последната колона като един низ, дори ако една от колоните съхранява NULL.
Решение 2:
Ще използваме CONCAT() функция. Ето заявката, която бихте написали:
SELECT CONCAT(first_name, middle_name, last_name) AS name FROM children;
Ето резултата:
| name |
|---|
| ЛиндаДжексън |
| MaryAliceThomson |
| Стивън |
| Кафяв |
Дискусия:
Използвайте CONCAT() функция за конкатениране на низови стойности от изрази или колони, съдържащи NULL. Тази функция приема списък от низове (или NULL) и показва всички тези стойности в един низ. Няма разделител между стойностите, така че резултатите (както в нашия пример) може да не са форматирани, както бихте очаквали. Как можем да коригираме това? Вижте друг CONCAT() заявка:
Решение 2:
Ето още една опция за заявка:
SELECT CONCAT(first_name,' ' , middle_name, ' ',last_name) AS name FROM children;
Ето резултата:
| name |
|---|
| Линда Джаксън |
| Мери Алис Томсън |
| Стивън |
| Кафяв |
Сега, освен стойностите на низовете, тази функция също заема някои интервали (поставени между конкатенираните стойности). Това отделя една част от името от друга. Но както виждаме, това решение също не е идеално; пълните имена без бащини имат допълнително пространство, докато записите само с едно име имат две допълнителни интервали.
В този случай CONCAT_WS() функцията е по-доброто решение.
Решение 3:
CONCAT_WS() функцията приема допълнителен първи аргумент:символ, който служи като разделител между низовете. Ето заявката:
SELECT
CONCAT_WS(' ' , first_name, middle_name, last_name) AS name
FROM children;
И резултатът:
| name |
|---|
| Линда Джаксън |
| Мери Алис Томсън |
| Стивън |
| Кафяв |
Тази заявка показва пълните имена на децата, без ненужни интервали.