2017-09-19 79 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_ - 好抓,谢谢。现在它是固定的。 –