在sql中拆分字符串并将其反转的函数

时间:2017-03-27 04:36:38

标签: mysql sql-server string split

我有一个列" 名称"在两个不同的表中,我想将名称拆分为两个不同的列为" 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获取它但不起作用。这是正确的方法还是我可以重构它?

1 个答案:

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