什么是连接可能包含空值的人名的最短TSQL

时间:2008-12-08 23:37:39

标签: sql sql-server tsql

3个字段:FirstName,MiddleName,LastName

任何字段都可以为null,但我不想要额外的空格。格式应为“First Middle Last”,“First Last”,“Last”等。

10 个答案:

答案 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