#sql #ssms #coalesce
Вопрос:
У меня есть пять полей, на которые мне нужно посмотреть: FirstName
, Surname
, DateOfBirth
, id
и Postcode
.
Если я запущу это (с помощью SQL Server Management Studio (SSMS)):
SELECT COALESCE(FirstName, Surname, DateOfBirth, id, Postcode) FROM table1
Он возвращает такие результаты:
1. DAVID 2. SUSAN 3. 764329 4. FRANK 5. STEPHANIE 6. HARRIS 7. 10/10/1967 8. E3 5QP 9. DAVID 10. JOHN
Проблема в том, что не всегда легко определить, откуда берутся результаты. Например, DAVID
и JOHN
это легко могут быть имена или фамилии.
Есть ли способ увидеть происхождение каждого результата? Что-то вроде этого:
1. DAVID FirstName 2. SUSAN FirstName 3. 764329 id 4. FRANK FirstName 5. STEPHANIE FirstName 6. HARRIS Surname 7. 10/10/1967 DateOfBirth 8. E3 5QP Postcode 9. DAVID Surname 10. JOHN Surname
Возможно, две колонки результатов были бы хороши: одна с результатом, а другая с происхождением.
Комментарии:
1. Единственный способ получить это-создать новый столбец на
CASE WHEN xxx is not NULL then 'source'
основеCoalesce
иерархии.2. Не совсем так.. вы можете использовать
CONCAT
@manibharataraju3. Ты прав. Моим мотивом было сказать, что вы должны сделать это вручную.
Ответ №1:
Вы не указали СУБД, но если вы действительно хотите использовать coalesce
, вы можете попробовать что-то вроде этого:
SELECT COALESCE(CONCAT(FirstName,' First Name'), CONCAT(Surname,' Surname'),...) FROM table1
Используйте CONCAT
или определенный способ вашей СУБД для объединения. CONCAT
должно возвращать значение null, если один из элементов в null, поэтому он должен работать одинаково.
Вы также можете создать новую колонку, используя CASE EXPRESSION
, как предложил @manibharataraju в комментариях.
Комментарии:
1. Это возвращает
DAVIDDAVID
SUSANSUSAN
,764329764329
и так далее.2. @Mus Тогда вы не использовали круглые скобки вокруг второго элемента
CONCAT
. Посмотрите на кодCONCAT(FirstName," First Name")
. Вторые аргументы-это строка, а не имя столбца.3. Я скопировал его точно в соответствии с вашим примером:
COALESCE(CONCAT(FirstName, "FirstName")...)
и так далее. Если я добавлю пробел после первой кавычки, как в вашем примере, он вернет ошибку о недопустимом имени столбца.4. Вы используете sql server? Вот почему важно указать вашу СУБД! Попробуйте заменить
"
в'
—gt;CONCAT(FirstName,' First Name')
5. Да, это так, и все — спасибо. Я тоже обновлю вопрос.