Tsql 串联NULL在T-SQL中返回一个值(CONCAT函数)

Tsql 串联NULL在T-SQL中返回一个值(CONCAT函数),tsql,concat,string-concatenation,Tsql,Concat,String Concatenation,当col1包含空值时,为什么返回 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 SELE

当col1包含空值时,为什么返回

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;
你可以用这种方式

测试代码如下

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;  
联络小组结果

A.1.X 
B.2 
C 
这种concats的另一个常见用法是使用全名,在本例中是。(点)替换为“”(空格),因为可以使用修剪,所以更容易操作

结果

FullName
FirtName MiddleName LastName
FistName  LastName

你得上老派。我在打电话,无法测试

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 -----------> 
cv col1 col2 col3 concatatitedvalue
--------- ----- ----- ----- -------------------
a、 b.c.a.b.c
aa.bb aa.bb aa.bb
x、 z x z.z
p.pp p.pp
!!!       !!!               !!!
.fff fff fff
这是一个涵盖所有可能性的答案

完整的测试用例

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

您的意思是
[COL1]
包含空字符串还是
NULL
?如果中间或第一列为空,它会是什么样子?相同的事情。不应该appear@user1721546你用我的答案作为你的问题,那太棒了哈哈!在您的示例数据中,您使用了
NULL
,但我认为他实际上使用了
'
CONCAT(REPLACE([a],'',NULL),'.+REPLACE([b],'',NULL),'.+REPLACE([c],'',NULL),'.+REPLACE([d],'',NULL))@user1721546我添加了一个NULLIF blank,其作用与您的REPLACE完全相同,我想这确实是我的问题的诡计,表明你的建议无法发挥作用。这仍然是错误的,如果第三个值为空,它会在结尾处给你一个点,Hugo Tereceros-恕我直言,你需要阅读所有的解决方案,然后再做出大胆的声明,比如,“这是这个问题的唯一有效答案,真正涵盖了所有可能性。”首先,我发布的内容也涵盖了所有可能性,是唯一一个没有SQL Server 2012的解决方案(这就是为什么我认为值得发布的原因)第二,你发布了两个答案-你是在暗示你的另一个答案是错误的吗?如果是,为什么不更正或删除它?艾伦,很抱歉,我编辑了我的答案,我不想伤害任何人
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