连接 NULL returns T-SQL 中的一个值(CONCAT 函数)

Concatenating NULL returns a value in T-SQL (CONCAT function)

为什么 col1 包含空白值时 return .

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;

你可以这样使用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 

这种连接的另一种常见用法是 连接全名,在本例中是 . (点)被替换为 ' ' (space),它使事情变得更容易,因为您可以使用 trim

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

你将不得不去老学校。我在 phone 上,无法测试。

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

----------------编辑----------------

好吧,这对我的 phone 来说并不像我想象的那么容易。这是我更新的解决方案,适用于 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);

RETURNS

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 -----------> 

这是一个涵盖所有可能性的答案

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