连接NULL返回T-SQL中的值(CONCAT函数)
为什么当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;
这是一个答案,涵盖所有可能性
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
Hugo Tereceros - 所有应有的尊重,你需要阅读所有的解决方案之前做出大胆的声明,如“这是对这个问题的真正涵盖所有可能性的唯一有效答案。” 首先,我发布的内容涵盖了所有可能性,并且是唯一没有SQL Server 2012的解决方案(这就是为什么我认为它值得发布)。其次,你发布了两个答案 - 你是否建议你的其他答案是错的?如果是这样,为什么不纠正或删除它? –
艾伦对不起,我编辑了我的答案,我不想伤害任何人 –
您可以使用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
在您的样本数据,你使用'NULL'但我觉得他其实有' ''' – SQLChao
CONCAT(REPLACE([一], '',NULL), '' + REPLACE([B], '',NULL) , '' + REPLACE([C], '',NULL), '' + REPLACE([d], '',NULL)) – user1721546
@ user1721546我加入** NULLIF空白**这恰好作为您REPLACE,我认为它的伎俩 –
你必须去老同学。我在我的手机上,无法测试。
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 ----------->
它仍然是错误的,如果第三值为null它可以让你在最后 –
@victor雨果terceros一个_dot_ - 好抓,谢谢。现在它是固定的。 –
你的意思'[COL1]'包含一个空字符串或'NULL'? – Skrrp
如果中间或第一列为空,它会是什么样子? – SQLChao
同样的事情了。不应该出现 – user1721546