Как использовать COALESCE() для добавления дополнительных символов
У меня есть следующий синтаксис в моем операторе SELECT:
CONCAT(first_name, " ", COALESCE(middle_initial), " ", last_name) AS full_name
Очевидно, что я получаю следующее:
For first_name='John' and middle_initial='A.' and last_name='Smith'
I get 'John A. Smith'
Это нормально и является желаемым результатом.
Но я получаю дополнительное место для следующих данных (которые я четко понимаю, почему):
For first_name='John' and middle_initial='' and last_name='Smith'
I get 'John Smith'
Есть ли способ с COALESCE()
добавить " ", если условие возвращает ненулевое значение?
Спасибо.
4 ответа
Когда middle_initial имеет '', вы захотите:
SELECT CONCAT(first_name, ' ',
CASE
WHEN middle_initial is null OR middle_initial = '' then ''
ELSE CONCAT(middle_initial, ' ')
END
, last_name) AS full_name
COALESCE
используется для проверки NULL
значения, не обрабатывая пустые строки, ''
select concat(first_name , ' ' ,
case when middle_initial is null then ''
when middle_initial = '' then ''
else concat(middle_initial, ' ') end ,
last_name)
этот запрос предполагает, что first_name и last_name не являются ни нулевыми, ни пустыми строками, в этом случае вы можете применить ту же логику к этим полям
Попробуй это
SELECT rtrim(Coalesce(first_name + ' ','')
+ Coalesce(nullif(middle_name,'') + ' ', '')
+ Coalesce(nullif(last_name,'') + ' ', ''))
FROM @table
SELECT rtrim(Coalesce('John' + ' ','')
+ Coalesce(nullif('A.','') + ' ', '')
+ Coalesce(nullif('Smith','') + ' ', ''))
SELECT rtrim(Coalesce('John' + ' ','')
+ Coalesce(nullif('','') + ' ', '')
+ Coalesce(nullif('Smith','') + ' ', ''))
Я думаю, что лучший способ сделать это так. Вы можете использовать такое ограничение для любого количества полей, переменных и так далее. Также это правильно покажет вам John
или же John A.
declare @Temp_Table table (first_name nvarchar(128), middle_initial nvarchar(128), last_name nvarchar(128))
insert into @Temp_Table
select 'John', null, 'Smith' union all
select 'John', 'A.', 'Smith' union all
select 'John', 'A.', null union all
select 'John', null, null
select
*,
stuff
(
isnull(' ' + nullif(first_name, ''), '') +
isnull(' ' + nullif(middle_initial, ''), '') +
isnull(' ' + nullif(last_name, ''), ''),
1, 1, ''
)
from @Temp_Table