我试图不在这里重新发明轮子......我有这四个领域:
[tbl_Contacts].[FirstName],
[tbl_Contacts].[MiddleInitial],
[tbl_Contacts].[LastName],
[tbl_Contacts].[Suffix]
我想在视图中创建一个FullName
字段,但如果字段为空,我就不能有额外的空格......
所以我做不到FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix...
因为如果没有中间的首字母或后缀,我会在字段中有2个额外的空格。我想我需要一个Case语句,但我认为有人会有一个方便的方法...此外,m iddleinitial
和suffix
可能为空。
答案 0 :(得分:25)
假设所有列都可以为空,您可以执行以下操作:
RTrim(Coalesce(FirstName + ' ','')
+ Coalesce(MiddleInitial + ' ', '')
+ Coalesce(LastName + ' ', '')
+ Coalesce(Suffix, ''))
这取决于添加到NULL值会产生NULL。
答案 1 :(得分:12)
无论您选择哪种选项,都需要考虑以下事项:这将是一个相当复杂且因此耗时的选项,特别是如果您在视图中对每一行进行评估,每次都会对每一行进行评估。 / p>
如果你经常需要这个,我建议你把它作为一个持久的计算字段添加到你的基表 - 比如:
ALTER TABLE dbo.tbl_Contacts
ADD FullName AS (insert the statement of your choice here) PERSISTED
当它持久化时,它将成为基础表的一部分,并由SQL Server存储并保持最新。当你查询它时,你得到当前值而不用会产生必须连接字段并确定使用哪个以及忽略哪些的成本......
需要考虑的事情 - 太多DBA和数据库开发人员倾向于忽视和/或不知道......
答案 2 :(得分:9)
您可能希望通过REPLACE()
函数传递FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix
并置,以便将重复的空格替换为单个空格。
REPLACE(FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix, ' ', ' ')
-- -- -
修改强>
注意到您的某些字段可能是NULL
,因此上述情况在这种情况下不起作用,因为整个字符串将变为NULL
。在这种情况下,您可以使用COALESCE()
method as suggested by Thomas,但仍将其包装在REPLACE()
中:
REPLACE(RTRIM(COALESCE(FirstName + ' ', '') +
COALESCE(MiddleInitial + ' ', '') +
COALESCE(LastName + ' ', '') +
COALESCE(Suffix, '')), ' ', ' ')
测试:
SELECT REPLACE(RTRIM(COALESCE('John' + ' ', '') +
COALESCE('' + ' ', '') +
COALESCE('Doe' + ' ', '') +
COALESCE(NULL, '')), ' ', ' ')
-- Returns: John Doe
答案 3 :(得分:1)
我必须加入名字,中间名和姓氏。我的挑战是处理NULL值,使用下面的代码。
RTRIM(LTRIM(RTRIM(isnull(@firstname,'') + ' ' + isnull(@middlename,'')) + ' ' + isnull(@lastname,'')))
如果您有兴趣,请测试不同的场景:)
DECLARE @firstname VARCHAR(MAX)
DECLARE @middlename VARCHAR(MAX)
DECLARE @lastname VARCHAR(MAX)
set @firstname = 'FirstName'
set @middlename = NULL
set @lastname = 'LastName'
SELECT '|'+RTRIM(LTRIM(RTRIM(isnull(@firstname,'') + ' ' + isnull(@middlename,'')) + ' ' + isnull(@lastname,'')))+'|'
--
答案 4 :(得分:1)
如果您使用的是SQL Server 2012+
,则可以使用CONCAT
和+
:
SELECT RTRIM(
CONCAT(FirstName + ' ', MiddleInitial + ' ', LastName + ' ', Suffix)
) AS [FullName]
FROM tbl_Contacts;
工作原理:
NULL
,那么NULL + ' '
→NULL
CONCAT
处理NULL
NULLs
,TRIM
最后一个空格。 的 LiveDemo
强>
答案 5 :(得分:0)
这是一个解决方案:
CREATE FUNCTION dbo.udf_IsNullOrEmpty
(
@vchCheckValue VARCHAR(MAX)
,@vchTrueValue VARCHAR(MAX)
,@vchFalseValue VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
RETURN CASE WHEN NULLIF(RTRIM(LTRIM(@vchCheckValue)),'') IS NULL THEN @vchTrueValue ELSE @vchFalseValue END
END
SELECT FirstName + ' ' +
dbo.udf_IsNullOrEmpty(MiddleInitial,'',MiddleInitial + ' ') +
LastName +
dbo.udf_IsNullOrEmpty(Suffix,'',' ' + Suffix)
FROM tbl_Contacts
答案 6 :(得分:0)
选择CONCAT(IFNULL(FirstName,''), ', IFNULL(MiddleName,''), ', IFNULL(LastName,''))AS名称 从表
答案 7 :(得分:0)
为什么不喜欢这个:
A problem occurred evaluating root project 'xxxxx'.
> Could not find method compile() for arguments [file collection] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
我的列不为空,所以这对我有用。
答案 8 :(得分:-1)
创建函数getfname(@n varchar(30)) 返回varchar(30) 如 开始 声明@s varchar(30) 设置@ s = LEFT(@ n,charindex('',@ n)-1) 回来@s 端
创建函数getLname(@n varchar(30)) 返回varchar(30) 如 开始 声明@s varchar(30)
设置@ s = substring(@ n,charindex('',@ n + 1),Len(@n))
返回@s 端
答案 9 :(得分:-2)
查询:
SELECT retire.employeehrmsid,
Isnull(retire.firstname, '') + ' '
+ Isnull(retire.middlename, '') + ' '
+ Isnull(retire.lastname, '') AS FullName,
retire.dojtoservice,
retire.designation,
emphistory.currentdoj,
emphistory.presentddo,
emphistory.office,
transfer.generatetid AS TransferID,
transfer.transferdate,
transfer.currentlocation,
transfer.newlocation,
transfer.datas AS Transfer_Doc,
release.generaterid AS ReleaseID,
release.releasedate,
release.datar AS Release_Doc,
employeeserviceupdate.dataeu AS Join_Doc
FROM retire
INNER JOIN emphistory
ON retire.id = emphistory.id
INNER JOIN employeeserviceupdate
ON retire.id = employeeserviceupdate.id
INNER JOIN transfer
ON retire.id = transfer.id
AND emphistory.ehrid = transfer.ehrid
INNER JOIN release
ON transfer.tid = release.tid