Как использовать 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

Пример SQLFiddle

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
Другие вопросы по тегам