【问题标题】:split firstname and lastname but only on first space [duplicate]拆分名字和姓氏,但仅在第一个空格上[重复]
【发布时间】:2014-08-03 15:27:55
【问题描述】:

我试图在 MSSQL 中只用第一个空格分割一个字符串 考虑到这里的全名可以有 2 个空格,我不知道该怎么做。

例子:

Henk de Vries

我想把它分成:

Firstname: Henk
Lastname: de Vries

【问题讨论】:

标签: sql sql-server


【解决方案1】:

使用CHARINDEX 查找第一个空格,然后使用LEFTRIGHT 提取用户的名字和姓氏

left(username, charindex(' ', username)-1) firstname, 
right(username, (len(username)-charindex(' ', username))) lastname

【讨论】:

    【解决方案2】:

    尝试使用Patindex

    create table #t(name varchar(20))
    insert into #t values('Henk de Vries')
    
    select substring(name,1,PATINDEX('% %',name)) as First_name,SUBSTRING(name,patindex('% %',name),LEN(name)) as Last_Name from #t
    

    这是由 t-clausen.dk 修复的,如 cmets 中所说的

    select left(name,charindex(' ',name+' ')) as First_Name,substring(name,charindex(' ',name+' '),len(name)) as Last_Name from #t
    

    An demo to test with

    Updated demo

    【讨论】:

    • 嘿,谢谢,我刚刚注意到我必须使用派生列(Visual Studio ssis)并在您的回答和谷歌的帮助下得到以下信息:):SUBSTRING(Name,FINDSTRING(Name, ",1) + 1,LEN(Name) - FINDSTRING(Name," ",1)) 非常感谢
    • 这不是处理拆分的最佳方式。您假设数据将始终包含一个空格。你可以使用 left, stuff 和 charindex 来获得更好的结果
    • @t-clausen.dk:是的+1!我没有看到 OP 提到这个 考虑到他们的全名可以有 2 个空格 但是你是对的!
    【解决方案3】:

    这是一个示例,将这个答案与所选答案进行比较,请注意,当只有 1 个名字时,所选答案有错误(我知道大多数人都有组合名字,但这不是一个完美的世界):

    SELECT 
      LEFT(name, charindex(char(32), name + char(32))) Firstname,
      STUFF(name, 1, charindex(char(32), name), '') LastName,
      -- included example from accepted answer
      substring(name,1,PATINDEX('% %',name)) as First_name,
      SUBSTRING(name,patindex('% %',name),LEN(name)) as Last_Name
    FROM (values('Henk de Vries'), ('Thomas')) x(name)
    

    结果

    Firstname LastName       First_name Last_Name
    Henk      de Vries       Henk       de Vries
    Thomas                              Thoma
    

    【讨论】:

      【解决方案4】:
      DECLARE @Name    VARCHAR(50) = 'Henk de Vries'
      
      SELECT SUBSTRING(@Name, 1, CHARINDEX(' ', @Name) - 1) AS [First Name],
             SUBSTRING(@Name, CHARINDEX(' ', @Name) + 1, LEN(@Name)) AS [Last Name]
      

      【讨论】:

      • 仅供参考:虽然您的回答看似合理,但在被标记为删除后,它已出现在“低质量帖子”队列中。我怀疑这是因为它只是一个没有解释的代码答案。
      • 我刚刚获取了结果集并根据为什么它被认为质量低的帖子编写了代码我已经根据数据库标准编写了查询。@OliverMatthews 给出了一个理由? ?
      猜你喜欢
      • 2020-12-22
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多