我有一个列" 名称"在两个不同的表中,我想将名称拆分为两个不同的列为" FirsrName "和" 姓氏"。我正在做的是创建一个函数并将值作为First和Last。
问题:
案例1 - 主要问题在第一个表格中,名称位于" Sahil Sharma"所以我必须在空间的基础上拆分名称。
案例2 - 在第二个表格中,名称就像" Sharma; Sahil"所以我需要在此基础上拆分功能;并且还将其反转为函数的输出如下:
FirstName - Sahil
姓氏 - 夏尔马
我在CHARINDEX和SUBSTRINGS中有点初学者,虽然在阅读了MSDN之后,我尝试了这段代码:
---Get First Name
CREATE FUNCTION [dbo].[GetFirstName](@fullname varchar(30))
RETURNS varchar(20)
AS
BEGIN
DECLARE @name nvarchar(20)
DECLARE @result [nvarchar](30)
SET @name = @fullname
--To Check for names for CRMS
IF(CHARINDEX(';', @name) > 0)
SET @result = SUBSTRING(@name, 0, CHARINDEX(';', @name))
---To Check names for eGlobal
ELSE
SET @result = SUBSTRING(@name, 0, CHARINDEX(' ', @name))
RETURN @result
END
GO
---Get Last Name
CREATE FUNCTION [dbo].[GetLastName](@fullname varchar(30))
RETURNS varchar(20)
AS
BEGIN
DECLARE @name nvarchar(30)
DECLARE @result [nvarchar](30)
SET @name = @fullname
--To Check for names for CRMS
IF(CHARINDEX(';', @name) > 0)
SET @result = SUBSTRING(@name, CHARINDEX(';', @name) + 1, LEN(@name) - CHARINDEX(';', @name));
---To Check names for eGlobal
ELSE
SET @result = SUBSTRING(@name, CHARINDEX(' ', @name) + 1, LEN(@name) - CHARINDEX(' ', @name));
RETURN @result
END
GO
CREATE FUNCTION [dbo].[GetFirstName](@fullname varchar(30))
RETURNS varchar(20)
AS
BEGIN
DECLARE @name nvarchar(20)
DECLARE @result [nvarchar](30)
SET @name = @fullname
--To Check for names for CRMS
IF(CHARINDEX(';', @name) > 0)
SET @result = SUBSTRING(@name, 0, CHARINDEX(';', @name))
---To Check names for eGlobal
ELSE
SET @result = SUBSTRING(@name, 0, CHARINDEX(' ', @name))
RETURN @result
END
GO
此代码无效,因为我认为我遗漏了一些东西。我的理解是CHARINDEX从字符串中搜索一个字符,SUBSTRING可以为我检索字符串的一部分。
我在代码中所做的是使用CHARINDEX搜索空格(''),然后使用SUBSTRING获取它但不起作用。这是正确的方法还是我可以重构它?
答案 0 :(得分:3)
对于姓氏,你需要从空格所在的位置开始,取@name的长度减去空格所在的位置:
select SUBSTRING(@name, CHARINDEX(' ', @name) + 1, LEN(@name) - CHARINDEX(' ', @name))
但如果您有first_name space mid_name space last_name
SUBSTRING的第二个参数是从哪里开始取字符的位置,最后一个参数是长度。
编辑:
您还可以使用REVERSE获取最后一个空格的位置:
CHARINDEX(' ', REVERSE(@name), 0)
我也非常积极地为SUBSTRING提供一个长度超过字符串长度的长度,将返回完整的字符串,因此姓氏也可以计算为:
SELECT SUBSTRING(@name, CHARINDEX(' ', REVERSE(@name), 0) - 1, 500)