【发布时间】:2008-12-08 23:37:39
【问题描述】:
3 个字段:名字、中间名、姓氏
任何字段都可以为空,但我不想要额外的空格。格式应为“First Middle Last”、“First Last”、“Last”等。
【问题讨论】:
-
我认为问题应该指定inline SQL。否则,您可以像提到的答案之一那样做一个单字符触发。
标签: sql sql-server tsql
3 个字段:名字、中间名、姓氏
任何字段都可以为空,但我不想要额外的空格。格式应为“First Middle Last”、“First Last”、“Last”等。
【问题讨论】:
标签: sql sql-server tsql
LTRIM(RTRIM(
LTRIM(RTRIM(ISNULL(FirstName, ''))) + ' ' +
LTRIM(RTRIM(ISNULL(MiddleName, ''))) + ' ' +
LTRIM(ISNULL(LastName, ''))
))
注意:这不会留下尾随或前导空格。这就是为什么它比其他解决方案有点丑。
【讨论】:
假设“额外空格”是指在连接期间插入的额外空格(我认为这是一个合理的假设。如果您的数据中有额外的空格,则应该清理它):
ISNULL(FirstName + ' ', '') + ISNULL(MiddleName + ' ', '') + ISNULL(LastName, '')
有效,因为您将在名称中添加一个空格 - 如果它为 NULL,则生成 NULL - 这将生成空字符串。
编辑:如果您不计算 SET OPTION - 它可以是连接或数据库选项:
SET CONCAT_NULL_YIELDS_NULL OFF
LTRIM(FirstName + ' ' + NULLIF(MiddleName + ' ', ' ') + LastName)
短了一点,但丑了一大截。
Edit2:既然您接受了 UDF 答案 - IMO,这有点作弊 - 这里有一些相同的内容:
SELECT a FROM b
b 是一个视图。 ;) 或者。一个存储过程,
EXEC c
但是,由于 EXEC 是可选的:
c
【讨论】:
使用 UDF:
`Select udfConcatName(First, Middle, Last) from foo`
这样你所有的名字连接逻辑都在一个地方,一旦你把它写下来,调用起来很简单。
【讨论】:
LTRIM(RTRIM(ISNULL(FirstName, '') + ' ' + LTRIM(ISNULL(MiddleName, '') + ' ' +
ISNULL(LastName, ''))))
【讨论】:
为什么不在表上使用计算列,使用此处发布的许多您喜欢的语法为您执行连接?然后您将只查询计算列 - 非常优雅,如果您保留计算列,那么您甚至可能会获得轻微的性能提升。 Example here
【讨论】:
replace(ltrim(rtrim(isnull(FirstName, '') + ' ' + isnull(MiddleName, '') + ' ' + isnull(LastName, ''))), ' ', ' ')
【讨论】:
'"' + 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
【讨论】:
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)),' '),'')
))
为什么会这样
如果为 NULL 或空格,LTRIM、RTRIM 和 ISNULL 函数会将字段缩减为空字符串。
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'
【讨论】:
LTrim(RTrim(Replace(IsNull(Firstname + ' ', '') +
isNull(MiddleName, '') +
IsNull(' ' + LastName, ''), ' ', ' ')))
【讨论】:
Select firstname, middlename, lastname, ProvidedName =
RTrim(Coalesce(FirstName + ' ','')
+ Coalesce(MiddleName + ' ', '')
+ Coalesce(LastName + ' ', '')
+ COALESCE('' + ' ', '')
+ COALESCE(NULL, ''))
From names
【讨论】: