2015-11-17 130 views
3

我有以下運動:SQL-服務器CONCAT情況

連擊第一,中間,姓和名的後綴,形成 客戶在以下格式名稱:[中間名]姓 姓氏[,後綴]。請注意,應該省略NULL值。

我將此解釋爲以下情形(從圖像中創建表並插入一些值):

請在下面找到我的樣本數據,名稱是#TB_Customer enter image description here客戶名稱是預期的結果,應該是形式

  • FirstName MiddleName.LastName, Suffix的,如果我有所有 領域enteries。
  • 中間名和後綴可以是可選的,所以情況是:

  • 如果有suffix但不是MiddleName然後CustomerName
    應該是形式Firstname LastName,Suffix

  • 的如果有一個MiddleName但不是suffix那麼CustomerName
    應該是FirstName MiddleName.LastName

  • 如果兩個MiddleNameSuffix爲空,然後CustomerName應該 是形式的FirstName LastName)

這就是我得到: enter image description here

但你可以看到客戶名稱的情況下查詢我寫的沒有按沒有按預期工作(請參閱上面的帶子彈的cases

我寫信得到CustomerName列的查詢是:

SELECT 
(case 
when (MiddleName is not null and Suffix is not null) then 
CONCAT(c.FIRSTNAME,' ', c.MiddleName,'.', c.LASTNAME, ', ',Suffix) 
when (MiddleName is null and suffix is null) then 
CONCAT(c.FIRSTNAME,' ' ,c.LASTNAME) 
when (MiddleName is null and Suffix is not null)then 
concat (c.FirstName, ' ', c.LastName, ', ',Suffix) 
when (Suffix is null and MiddleName is not null) then 
concat (c.FirstName, ' ',MiddleName,'.',LastName) 
end 
)AS CustomerName 
,c.* 
FROM #TB_Customer c; 

我有2個問題:

  • 我才明白鍛鍊和做我有一個很好的邏輯是什麼?
  • 我在哪裏犯了一個錯誤,什麼是正確的查詢?

使用SQL-Server 2012的

編輯

重建我的情況,請參見下面的代碼(抱歉沒有連接小提琴,但該網站是不是在我的當前位置響應)

CREATE TABLE #TB_Customer 
(
CustomerID int , --PK 
Title varchar(50), 
FirstName varchar(50), 
MiddleName varchar(50), 
LastName varchar(50), 
Suffix varchar(50), 
EmailAddress varchar(50), 
Phone varchar(50), 
Gender varchar(50), 
Birthdate varchar(50), 
--no fk 
PRIMARY KEY (CustomerID) 
) 

insert into #TB_Customer values 
('1','Sir','John','Jacob','Adams','St','[email protected]','0677731235','M','1989-04-06'), 
('2','Mr.','Russel','Thyrone','Peterson','pr','[email protected]','555-010405','M','1963-02-01'), 
('3','Ms.','Anne','Candice','Acola','aca','[email protected]','07408989989','F','1988-05-19'), 
('4','Mrs.','Sophia','Veronika','Turner','tvs','[email protected]','0423423887','F','1983-06-20'), 
('5','Ms','Margaret','','Delafleur','','[email protected]','233223355','Female','1982-02-25'), 
('6','Mrs','Jessica','Luana','Cruz','','[email protected]','787876631','Female','1922-05-05'), 
('7','Mr','Dyrius','','Cruz','dc','[email protected]','0673332211','Male','1987-03-01') 

update #TB_Customer 
set Gender = 'Male' where Gender = 'M' 
update #TB_Customer 
set Gender = 'Female' where Gender = 'F' 
+0

似乎沒給我。 –

+1

@DanBracuk請參閱第5行的預期結果。那不好。同樣是第7行 – CM2K

+2

當你不顯示結果時,我們應該如何看到你的查詢不起作用?此外,您列出三個案例,您的代碼有四個,並且順序相當奇怪。 – Henrik

回答

1

像這樣的東西應該工作以及...

SELECT concat(firstname 
    ,CASE WHEN ISNULL(middlename,'') <> '' THEN ' '+middlename+'.' 
     WHEN ISNULL(middlename,'') <> '' AND ISNULL(suffix,'') = '' THEN '.' 
     ELSE ' ' END 
    ,lastname 
    ,CASE WHEN ISNULL(suffix,'') <> '' THEN ', '+suffix END) 
FROM #TB_Customer 

OUTPUT:

John Jacob.Adams, St 
Russel Thyrone.Peterson, pr 
Anne Candice.Acola, aca 
Sophia Veronika.Turner, tvs 
Margaret Delafleur 
Jessica Luana.Cruz 
Dyrius Cruz, dc 
John Adams, St 
+1

你錯過了點,除了看起來不錯 – CM2K

+0

@ CM2K請參閱編輯。 – Doolius

+0

標記爲提供不使用'coalesce'的工作解決方案的答案(試圖僅通過案例來完成,謝謝) – CM2K

1

我不能看到你的查詢錯誤,我知道如果其中一列是空的,所有其他的將是,但試試這種方式:

SELECT COALESCE(c.FIRSTNAME,'') + ' ' + 
     CASE WHEN COALESCE(c.MiddleName,'') = '' 
       THEN '' 
       ELSE c.MiddleName + '.' 
      END 
     + COALESCE(c.LASTNAME,'') + 
     CASE WHEN COALESCE(Suffix,'') = '' 
       THEN '' 
       ELSE ', ' + Suffix 
      END AS CustomerName, c.* 

FROM #TB_Customer c; 

@Henrik是正確的 '' 和NULL是diferent事情

+0

這給出了第5行(請參閱第2張圖片)。 「瑪格麗特。德拉弗勒,」應該給瑪格麗特德拉弗勒爾,沒有點或逗號 – CM2K

+0

編輯,但圖片顯示之前Delafleur點 –

+0

這很好,謝謝。接受Doolius的答案,因爲它不使用coalesce,只是尋找案件(但很好的解決方案,有我的upvote) – CM2K

0

現在你已經給出了代碼,我可以看到錯誤是什麼:空字符串與NULL不同。

因此,您的中間名/後綴存在的測試將始終爲真。

要麼將​​這些字段設置爲NULL,要麼增大測試以檢查NULL或空字符串。

+0

感謝您的回答,我不知道如何「檢查NULL或空字符串「。想法? – CM2K

+1

您可以使用「field IS NULL」和空字符串「field =''」來檢查NULL,並將它們與AND或OR(可能還有一些括號)組合在一起,就像您已經擁有的一樣。 – Henrik

+0

想這樣做,不起作用:'選擇 (案件 時(MiddleName不爲空,後綴不爲空),然後 CONCAT(c.FIRSTNAME,'',c.MiddleName,'。',c。 (MiddleName爲空或MiddleName ='')和(後綴爲空或後綴='') CONCAT(c.FIRSTNAME,'',c.LASTNAME) when(MiddleName,',',Suffix) when (後綴爲空或後綴='')和MiddleName爲空或MiddleName ='')和(後綴不爲空),則 concat(c.FirstName,'',c.LastName,',',Suffix) (c.FirstName,'',MiddleName,'。',LastName) end )AS客戶名稱 ,c。* FROM #TB_Customer c;' – CM2K

1
SELECT 
    STUFF(RTRIM(
     CONCAT(' ', 
      COALESCE(NULLIF(FirstName,'') + ' ', ''), 
      COALESCE(NULLIF(MiddleName,'') + '.', ''), 
      COALESCE(NULLIF(LastName,''), ''), 
      COALESCE(', ' + NULLIF(Suffix,'') , '') 
     ) 
    ), 2, 0,'') 
FROM #TB_Customer tc 

加入STUFF櫃面一些奇怪的原因你已經是一個後綴

+0

這很好,謝謝。接受Doolius的答案,因爲它不使用coalesce,只是尋找案件(但很好的解決方案,有我的upvote) – CM2K

+1

@ CM2K謝謝..你可能也想看看這也..它的名字, d實際上是想看到它,如果你正在創建某種名稱標籤.. http://sqlfiddle.com/#!6/76d65/1只使用中間首字母和 – JamieD77

+0

看起來不錯,感謝分享你的知識 – CM2K

相關問題