2012-10-19 51 views
1

我已在SELECT語句的語法如下:如何使用COALESCE()來添加其他字符

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

如果你的'middle_initial'是一個空字符串,它不一定'NULL'。有些RDBMS將''''和'NULL'視爲同一件事,有些則不然。你正在使用哪種RDBMS? – MatBailie

+0

MySQL與表和列整理「utf8_general_ci」 –

+0

謝謝@Dems - 我不嫁給CO​​ALSCE() - 它似乎讓我接近我試圖做的事情。有沒有不同的方式來做到這一點 - 比如說使用IF()? –

回答

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 Example

COALESCE用於檢查NULL值,而不是處理空字符串,'

+0

,但它middle_initial是空字符串,這將附加一個額外的空間 –

+0

如果你有''而不只是空值,我會更新我的答案來解決這個問題。 'COALESCE'負責處理NULL值 –

+1

與@LuisSiquot相同回答 –

2
select concat(first_name , ' ' , 
    case when middle_initial is null then '' 
      when middle_initial = '' then '' 
      else concat(middle_initial, ' ') end , 
    last_name) 

此查詢asumes是FIRST_NAME和姓氏不爲空,也沒有空字符串,在這種情況下,你可以將同樣的邏輯,表格中

+0

在這個答案中返回的結果是零(0) –

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','') + ' ', '')) 
+0

爲什麼你的anwser有'常量'而不是fields_names? –

+0

是OP可以用列名替換常量,這是使用不同數據的示例查詢,以顯示它如何實現。 –

+0

我很高興你替換了becouse可能難以猜測'nullif('','')'中的替換位置,例如 –

1

我認爲最好的辦法是不喜歡這樣。你可以對任何數量的字段,變量等使用這樣的constraction。此外,它會正確顯示您的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 
+0

我得到了'調用本地函數'isnull''不正確的參數數量' –

+0

等一下我會創建你的MySQL例子 –

+0

好的,謝謝@RomanPekar - 但我得到了選定的答案以上爲我工作,我需要繼續前進。 –

相關問題