1

我的 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

4 回答 4

3

当 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值,不处理空字符串,''

于 2012-10-19T13:44:20.667 回答
2
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 不是 null 也不是空字符串,在这种情况下,您可以将相同的逻辑应用于该字段

于 2012-10-19T13:41:02.963 回答
1

试试这个

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','') + ' ', ''))
于 2012-10-19T13:55:59.957 回答
1

我认为最好的方法是这样做。您可以对任意数量的字段、变量等使用这种结构。它还会正确显示您JohnJohn 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
于 2012-10-19T13:58:01.077 回答