连接 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
为什么 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