提问人:Adele 提问时间:11/16/2023 最后编辑:XedniAdele 更新时间:11/16/2023 访问量:40
具有 NULL 值的合并函数与 concat 函数
coalesce vs. concat functions with NULL values
问:
这是我的表格:在我的表格中输入图像描述
SELECT
Title+' '+FirstName+' '+MiddleName+' '+LastName as FullName
from employees
Where BusinessEntityID IN (1,2,4)
但结果是我只得到中间一行,因为这是唯一不包含 NULL 值的一行。
工作正常,但我想知道是否有针对此问题的解决方案。concat()
coalesce
你能帮忙吗?
答:
0赞
Tim Biegeleisen
11/16/2023
#1
在 SQL Server 2017 或更高版本上,CONCAT_WS
函数提供了一种很好的方法:
SELECT
Title + CONCAT_WS(' ', FirstName, MiddleName, LastName) AS FullName
FROM employees
WHERE BusinessEntityID IN (1, 2, 4);
CONCAT_WS()
将忽略 null 参数。
0赞
Xedni
11/16/2023
#2
所以你遇到的问题是(幼稚的)空值串联使整个字符串为空。是否只使用 / 或 / 的问题归结为您是否希望将 null 值解释为空字符串,或者是否要替换其中的不同值。concat
concat_ws
coalesce
isnull
如果你想要的只是一个空字符串,那么 的变体是最简单的方法。如果您想将值替换为空字符串以外的其他值,您通常希望/需要伸手(我举了几个例子,例如,如果出于某种原因,您想给每个人一个默认的中间名。荒谬,我知道。这并不是说你不能那样做,只是使用 .concat
coalesce/isnull
x
concat
您可以通过以下几种不同的方式来看待您的问题。但是,请不要,如果你的中间名是 null,那么你正在做或你正在使用而不是 ,这意味着如果你的中间名是 null,你的字符串中将有两个空格,而不是一个。在处理空值时,您需要考虑到这一点。' ' + isnull(Middle, '') + ' '
concat
concat_ws
;with a ( first, Middle, last) as
(
select 'Janos', 'j', 'Sanchez' union all
select 'Rob', null, 'walters'
)
select
First,
Middle,
Last,
NaiveConcat = First + ' ' + Middle + ' ' + Last,
NaiveConcatWithCoalesce = coalesce(First, '') + ' ' + coalesce(Middle, '') + ' ' + coalesce(Last, ''),
NaiveConcatWithSubstitution = isnull(First, '') + ' ' + isnull(Middle, 'x') + ' ' + isnull(Last, ''),
NaiveConcatWithIsnull= isnull(First, '') + ' ' + isnull(Middle, '') + ' ' + isnull(Last, ''),
TrueConcat = concat(First, ' ', Middle, ' ', Last), -- watch out for double spaces!
TrueConcatWithSubstitution = concat(First, ' ', isnull(Middle, 'x'), ' ', Last),
WSConcat = concat_ws(' ', First, Middle, Last)
from a
评论
1赞
Charlieface
11/16/2023
FirstName + ' ' + isnull(Middle + ' ', '') + LastName
是一种常见的解决方案
评论