2017-09-19 80 views
1

爲什麼當col1包含空值時返回.連接NULL返回T-SQL中的值(CONCAT函數)

CONCAT(NULLIF([COL1],''),'.') 

我有3列,我需要與之間有時列包含一個空白值的.來連接。在這種情況下,尾部.不應連接在一起。我使用哪些功能?

col1 col2 col3 
A  1 x 
B  2  

預計業績:

A.1.X 
B.2 

測試代碼:

DECLARE @tbl TABLE(a varchar(100),b varchar(100),c varchar(100)) 
INSERT INTO @tbl 
SELECT 'A','1','X' UNION 
SELECT 'B','2','' UNION 
SELECT 'C','','' UNION 
SELECT '','1','X' UNION 
SELECT 'B','','' UNION 
SELECT 'C','','' 

SELECT CONCAT (Nullif(a,''),'.' + nullif(b,''), '.' + nullif(c,'')) AS Contact_Result FROM @tbl; 
+0

你的意思'[COL1]'包含一個空字符串或'NULL'? – Skrrp

+0

如果中間或第一列爲空,它會是什麼樣子? – SQLChao

+0

同樣的事情了。不應該出現 – user1721546

回答

0

這是一個答案,涵蓋所有可能性

SELECT SUBSTRING(CONCAT ('.' + NULLIF(a,''),'.' + NULLIF(b,''),'.' + NULLIF(c,'')),2,10000) AS Contact_Result FROM @tbl; 

完整的測試用例

DECLARE @tbl TABLE(a varchar(100),b varchar(100),c varchar(100)) 
INSERT INTO @tbl 
SELECT 'a','','' UNION 
SELECT 'a','b','' UNION 
SELECT 'a','b','c' UNION 
SELECT 'a','','c' UNION 
SELECT '','b','c' UNION 
SELECT '','b','' UNION 
SELECT '','','c' UNION 
SELECT '','','' 


SELECT SUBSTRING(CONCAT ('.' + NULLIF(a,''),'.' + NULLIF(b,''),'.' + NULLIF(c,'')),2,10000) AS Contact_Result FROM @tbl; 

結果

c 
b 
b.c 
a 
a.c 
a.b 
a.b.c 
+0

Hugo Tereceros - 所有應有的尊重,你需要閱讀所有的解決方案之前做出大膽的聲明,如「這是對這個問題的真正涵蓋所有可能性的唯一有效答案。」 首先,我發佈的內容涵蓋了所有可能性,並且是唯一沒有SQL Server 2012的解決方案(這就是爲什麼我認爲它值得發佈)。其次,你發佈了兩個答案 - 你是否建議你的其他答案是錯的?如果是這樣,爲什麼不糾正或刪除它? –

+1

艾倫對不起,我編輯了我的答案,我不想傷害任何人 –

1

您可以使用SQL CONCAT這樣

SELECT CONCAT (a,IIF((NULLIF(a,'')+NULLIF(b,'')) IS NULL,'','.'),b,IIF((NULLIF(b,'')+NULLIF(c,'')) IS NULL,'','.'), c) AS Contact_Result FROM @tbl; 

測試代碼如下

DECLARE @tbl TABLE(a varchar(100),b varchar(100),c varchar(100)) 
INSERT INTO @tbl 
SELECT 'A','1','X' UNION 
SELECT 'B','2',NULL UNION 
SELECT 'C',NULL,NULL 


SELECT CONCAT (a,IIF((NULLIF(a,'')+NULLIF(b,'')) IS NULL,'','.'),b,IIF((NULLIF(b,'')+NULLIF(c,'')) IS NULL,'','.'), c) AS Contact_Result FROM @tbl; 

Contact_Result

A.1.X 
B.2 
C 

另一種常見的使用這種concats的是的毗連全名在這種情況下。 (點)由「」(空格)代替,它使事情更容易,因爲你可以使用修剪

DECLARE @tbl TABLE(a varchar(100),b varchar(100),c varchar(100)) 
INSERT INTO @tbl 
SELECT 'FirtName','MiddleName','LastName' UNION 
SELECT 'FistName','','LastName' UNION 
SELECT '','','FullName' 


SELECT LTRIM(CONCAT (a,' ' + b,' ' + c)) AS Contact_Result FROM @tbl; 

結果

FullName 
FirtName MiddleName LastName 
FistName LastName 
+1

在您的樣本數據,你使用'NULL'但我覺得他其實有' ''' – SQLChao

+1

CONCAT(REPLACE([一], '',NULL), '' + REPLACE([B], '',NULL) , '' + REPLACE([C], '',NULL), '' + REPLACE([d], '',NULL)) – user1721546

+0

@ user1721546我加入** NULLIF空白**這恰好作爲您REPLACE,我認爲它的伎倆 –

0

你必須去老同學。我在我的手機上,無法測試。

ISNULL(NULLIF([COL1], '')+ ' ' '')+ ISNULL(NULLIF([COL2],' ')+'。', '')+ ISNULL( NULLIF([COL3],''),'');

----------------編輯----------------

好吧,這不是就像我想的那樣容易在我的手機上。這裏是我的最新解決方案,它使用SQL Server的作品2005+

-- sample data 
declare @table table 
(
    id int identity, 
    col1 varchar(10), 
    col2 varchar(10), 
    col3 varchar(10) 
); 

insert @table (col1, col2, col3) 
values ('a','b','c'), ('aa','bb',''), ('x','','z'), ('','p','pp'), 
     ('!!!','',''), ('','','fff'), ('','',''); 

-- My solution 
select col1, col2, col3, concatinatedValue = 
    case when cv like '.%' then stuff(cv, 1, 1,'') else cv end 
from @table 
cross apply (values 
    (isnull(nullif([col1],''), '') + 
    isnull('.'+nullif([col2],''), '') + 
    isnull('.'+nullif([col3],''), ''))) v(cv); 

退貨

cv  col1 col2 col3 concatinatedValue 
--------- ----- ----- ----- ------------------- 
a.b.c  a  b  c  a.b.c 
aa.bb  aa bb   aa.bb 
x.z  x   z  x.z 
.p.pp   p  pp p.pp 
!!!  !!!    !!! 
.fff     fff fff 
<----------- blank line -----------> 
+0

它仍然是錯誤的,如果第三值爲null它可以讓你在最後 –

+0

@victor雨果terceros一個_dot_ - 好抓,謝謝。現在它是固定的。 –