我的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()
追加“”的方法?
谢谢。
答案 0 :(得分: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
COALESCE
用于检查NULL
值,而不是处理空字符串,''
答案 1 :(得分: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也不是空字符串,在这种情况下,您可以将相同的逻辑应用于该字段
答案 2 :(得分: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','') + ' ', ''))
答案 3 :(得分:1)
我认为最好的办法就是这样做。您可以对任意数量的字段,变量等使用此类构造。此外,它会正确显示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