3个字段:FirstName,MiddleName,LastName
任何字段都可以为null,但我不想要额外的空格。格式应为“First Middle Last”,“First Last”,“Last”等。
答案 0 :(得分:10)
LTRIM(RTRIM(
LTRIM(RTRIM(ISNULL(FirstName, ''))) + ' ' +
LTRIM(RTRIM(ISNULL(MiddleName, ''))) + ' ' +
LTRIM(ISNULL(LastName, ''))
))
注意:这不会留下尾随或前导空格。这就是为什么它比其他解决方案更加丑陋。
答案 1 :(得分:8)
假设“额外空格”,你的意思是在连接期间插入了额外的空格(我认为这是一个合理的假设。如果你的数据中有额外的空格,你应该清理它):
ISNULL(FirstName + ' ', '') + ISNULL(MiddleName + ' ', '') + ISNULL(LastName, '')
有效,因为你将在名称中添加一个空格 - 如果它为NULL则产生NULL - 这会产生空字符串。
编辑:如果不计算SET OPTION - 可以是连接或db选项:
SET CONCAT_NULL_YIELDS_NULL OFF
LTRIM(FirstName + ' ' + NULLIF(MiddleName + ' ', ' ') + LastName)
有点短,但有点大。
Edit2:既然你接受了UDF的答案 - 国际海事组织,这有点作弊 - 这里有一些相同的情况:
SELECT a FROM b
b是一个观点。 ;) 要么。存储过程,
EXEC c
但是,由于EXEC是可选的:
c
答案 2 :(得分:4)
使用UDF:
`Select udfConcatName(First, Middle, Last) from foo`
这样你所有用于连接名字的逻辑都在一个地方,一旦你写完它就很难打电话。
答案 3 :(得分:3)
LTRIM(RTRIM(ISNULL(FirstName, '') + ' ' + LTRIM(ISNULL(MiddleName, '') + ' ' +
ISNULL(LastName, ''))))
答案 4 :(得分:2)
为什么不在表上使用计算列来执行concat,使用您在此处发布的许多语法中的首选语法?然后你将只查询计算列 - 非常优雅,如果你坚持计算列,那么你甚至可以获得轻微的性能提升。 Example here
答案 5 :(得分:1)
replace(ltrim(rtrim(isnull(FirstName, '') + ' ' + isnull(MiddleName, '') + ' ' + isnull(LastName, ''))), ' ', ' ')
答案 6 :(得分:0)
LTrim(RTrim(Replace(IsNull(Firstname + ' ', '') +
isNull(MiddleName, '') +
IsNull(' ' + LastName, ''), ' ', ' ')))
答案 7 :(得分:0)
'"' + ltrim(rtrim(isnull(FirstName,''))) + ' ' + ltrim(rtrim(isnull(MiddleName,''))) +
' ' + ltrim(rtrim(isnull(LastName,''))) + '","' + ltrim(rtrim(isnull(FirstName,''))) +
' ' + ltrim(rtrim(isnull(LastName,''))) + '","' + ltrim(rtrim(isnull(LastName,''))) +
'"'
ETC
答案 8 :(得分:0)
DECLARE @first varchar(10) = 'First'
DECLARE @middle varchar(10) = ''
DECLARE @last varchar(10) = 'Last'
LTRIM(RTRIM(
@first
+ ISNULL(NULLIF(' '+LTRIM(RTRIM(@middle)),' '),'')
+ ISNULL(NULLIF(' '+LTRIM(RTRIM(@last)),' '),'')
))
为什么这样做
如果LTRIM,RTRIM和ISNULL函数为NULL或空格,则字段将缩减为空字符串。
LTRIM(RTRIM(ISNULL(@middle,''))) -- Result is a trimmed non-null string value.
该值以单个空格为前缀,然后由NULLIF函数与单个空格进行比较。如果相等,则结果为NULL。如果不相等,则使用该值。
NULLIF(' '+'',' ') -- this would return NULL
NULLIF(' '+'Smith',' ') -- this would return ' Smith'
最后,ISNULL()用于将NULLIF传递的NULL转换为空字符串。
ISNULL(NULL,'') -- this would return ''
ISNULL(' Smith','') -- this would return ' Smith'
答案 9 :(得分:0)
Select firstname, middlename, lastname, ProvidedName =
RTrim(Coalesce(FirstName + ' ','')
+ Coalesce(MiddleName + ' ', '')
+ Coalesce(LastName + ' ', '')
+ COALESCE('' + ' ', '')
+ COALESCE(NULL, ''))
From names