【问题标题】:How to split full name in a variable to first and last names within SQL Server?如何将变量中的全名拆分为 SQL Server 中的名字和姓氏?
【发布时间】:2018-09-11 09:00:54
【问题描述】:

我有一个 SQL Server 存储过程,它使用 SSIS 从 csv 读取数据并将数据填充到 SQL Server 2008 的不同表中。

我遇到的问题是,在 csv 中,我有一个名为 name 的列,我将其传递给变量 @name,但这个名称的名字和姓氏之间用空格分隔。

样本值:

@name = 'sullivian white'

但是,这个单一的变量值必须保存到数据库中的两列下,名为firstnamelast name

如何提取数据?有没有办法使用子字符串来拆分这个变量?

【问题讨论】:

  • 或许值得看看 JosephStyons 的 excellent answer,它涵盖了大量案例。 EfficionDave 把它变成了一个函数here

标签: sql-server-2008 ssis


【解决方案1】:

您可以使用substringcharindex

declare @name varchar(50)
set @name = 'sullivian white'

select
  substring(@name, 1, charindex(' ', @name)-1),
  substring(@name, charindex(' ', @name)+1, len(@name))

【讨论】:

  • 如果您要处理大量数据,那么您可能需要考虑各种可能性,例如“John Van Bergen”或“Mary Kay Williams”的名字
【解决方案2】:

我假设姓氏只有一个实体,但名字可以有多个实体。

查询变量值:

DECLARE @Name       NVARCHAR(60)
DECLARE @LastSpace  INT

SET @Name       = 'Mary Kay Williams'
SET @LastSpace  = CHARINDEX(' ', REVERSE(@Name))

SELECT  @Name   AS FullName
    ,   SUBSTRING(@Name, 1, LEN(@Name) - @LastSpace)                AS FirstName
    ,   SUBSTRING(@Name, LEN(@Name) - @LastSpace + 1, @LastSpace)   AS LastName

查询集合:

SELECT Name,
        SUBSTRING(      Name
                    ,   1
                    ,   LEN(Name) - CHARINDEX(' ', REVERSE(Name))
                ) AS FirstName,
        SUBSTRING(      Name
                    ,   LEN(Name) - CHARINDEX(' ', REVERSE(Name)) + 1
                    ,   CHARINDEX(' ', REVERSE(Name))
                ) AS LastName
FROM
(
    SELECT 'Sullivan White'     Name UNION
    SELECT 'John Van Bergen'    Name UNION
    SELECT 'Mark Kay Williams'  Name
) Names

【讨论】:

    【解决方案3】:

    想象一下这个名字有三个或四个空格。 感谢Tek-Tips

    ,我找到了解决方案
    //The way to extract name depends on how much separations does the name have.
    DECLARE @NOMBRE VARCHAR(50) = 'YOCASTA DE LA MOTA FERNANDEZ CAMARENA'
    declare @Name varchar(50)
    declare @LastName varchar(50)
    
    SELECT 
    @Name = SUBSTRING(@NOMBRE,0,CHARINDEX(' ', @NOMBRE,  CHARINDEX(' ', @NOMBRE,    CHARINDEX(' ',@NOMBRE,CHARINDEX(' ',@NOMBRE)+1) + 1) + 1))
    ,@LastName =  SUBSTRING(@NOMBRE,
    CHARINDEX(' ', @NOMBRE,
      CHARINDEX(' ', @NOMBRE,
        CHARINDEX(' ',@NOMBRE,CHARINDEX(' ',@NOMBRE)+1) + 1) + 1),LEN(@NOMBRE))
    
        select @Name,@LastName
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多