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

Posted

技术标签:

【中文标题】在sql中拆分字符串并反转它的函数【英文标题】:Function to split string and reverse it in sql 【发布时间】:2017-03-27 04:36:38 【问题描述】:

我在两个不同的表中有一个名为“Name”的列,我想将名称分成两个不同的列,分别是“FirsrName”和“LastName” ”。我正在做的是创建一个函数并获取 First 和 Last 的值。

问题: 案例 1 - 主要问题在第一个表中,名称为“Sahil Sharma”,因此我必须根据空间拆分名称。 案例 2 - 在第二个表中,名称类似于“Sharma;Sahil”,所以我需要在 ; 的基础上拆分功能并将其反转为函数的输出,如下所示: 名字 - 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

---获取姓氏

    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

此代码不起作用,因为我认为我遗漏了一些东西。我的理解是 CHARINDEX 从字符串中搜索一个字符,SUBSTRING 可以为我检索字符串的一部分。

我在代码中所做的是使用 CHARINDEX 搜索空格 (' '),然后使用 SUBSTRING 获取它,但它不起作用。这是正确的方法还是我可以对其进行更多重构?

【问题讨论】:

【参考方案1】:

对于姓氏,您需要从空格所在的位置开始,并取@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)

【讨论】:

dev.mysql.com/doc/refman/5.7/en/… 你不能从末尾开始搜索以“跳过”中间名,但我想它需要更多的计算才能看到从头到尾的空间相对于哪里字符串的开头。 (?) 非常感谢。我已经更新了问题并使用建议修改了代码。 @LouisLoudogTrottier 请参阅编辑以在中间名的情况下使用最后一个空格的位置。

以上是关于在sql中拆分字符串并反转它的函数的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中怎么把字符串两位两位的反转

在字段中拆分字符串并用作 sql 中的新列名

第九十四章 SQL函数 %MINUS

将 T-SQL 表值函数字符串拆分为 C#

在 SQL Server 2008 的拆分函数中使用连接表列

在 SQL 中使用 xml 标签拆分字符串