代码之家  ›  专栏  ›  技术社区  ›  Kashif

在select语句中将数据删除并拆分为多个列

  •  2
  • Kashif  · 技术社区  · 15 年前

    我有下表这样的数据

    alt text

    我想从名称中删除标题(Miss先生、Dr等),如果存在两个名称,我想将数据拆分为名字和姓氏。

    我想在select语句中使用这个。我可以使用case语句删除标题,但不能在同一case语句中将名称拆分为tow。

    我想要这样的数据,但在select语句中,删除了标题并拆分了名称。

    alt text

    4 回复  |  直到 9 年前
        1
  •  2
  •   Jeremy Morgan    15 年前

    使用子字符串可以很容易地做到这一点。您希望按空格拆分字符串,然后忽略索引中的第一个元素,大致如下所示:

    SELECT SUBSTRING(@ourName, 1, CHARINDEX(' ', @ourName)) AS [First],
    SUBSTRING(@ourName, CHARINDEX(' ', @ourName) + 2, LEN(@ourName)) AS[Last]
    

    没有测试,但这与你想做的非常接近。您将把字符串分解成一个数组,如下所示:

    〔0〕前缀 〔1〕第一名称 [ 2 ]姓

    只抓到1和2。但是,如果没有前缀,这将中断。

        2
  •  1
  •   Sparky    15 年前

    尝试以下UDF

    create function dbo.ExtractName(@TheName VARCHAR(200),@Which CHAR(1) )
    returns VARCHAR(100)
    as
    begin
        declare @Ans    VARCHAR(100)
        -- Get rid of common saluations
        SET @theName = replace(replace(@theName,'mr.',''),'mrs.','')
        SET @theName = replace(replace(@theName,'ms',''),'miss','')
        SET @theName = replace(replace(@theName,'dr.',''),'sir','')
    
        SET @Ans = rtrim(ltrim(@theName))+'  '
    
        -- Assume last name
        if @Which = 'L'
            set @ans = rtrim(substring(@ans,charindex(' ',@ans)+1,99))
        else
            set @ans = left(@ans,charindex(' ',@ans)-1)
    
        if len(@ans)='' set @ans= null
    
        return @ans
    end
    go
    print dbo.ExtractName('Mr. Rick Pepper','F')
    print dbo.ExtractName('Mr. Rick Pepper','L')
    

    提取名称可能非常复杂,因为有大量可能的前缀,有时名称会先存储在最后。有些名字有后缀,如JR.或PhD。希望这个UDF能给你一个起点…

        3
  •  0
  •   j.a.estevan    15 年前

    您可以将Jeremy答案与连接的案例陈述结合起来,以满足您的需求。这将是一个相当复杂的句子,但它可以用。

        4
  •  0
  •   priyanka.sarkar    15 年前

    试试这个

    declare @tbl table (GoodName varchar(50)) 
    insert into @tbl select 'Mr.Rick Pepper' 
    insert into @tbl select 'Miss  Lara Harper' 
    insert into @tbl select 'Mrs Kim' 
    insert into @tbl select 'Dr.Alan White' 
    insert into @tbl select 'Adam Jones' 
    insert into @tbl select 'William' 
    insert into @tbl select 'Sir Clark' 
    

    --程序启动

    select 
     case when CHARINDEX(',',FilteredName) = 0 then FilteredName else SUBSTRING(FilteredName,0,CHARINDEX(',',FilteredName)) end as FirstName 
     ,case when CHARINDEX(',',FilteredName) = 0 then Null else SUBSTRING(FilteredName,CHARINDEX(',',FilteredName)+1,LEN(FilteredName)) end as LastName 
     from (
     select REPLACE(LTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(GoodName,'Mr.',''),'Miss',''),'Mrs',''),'Dr.',''),'Sir','')),' ',',') as FilteredName
     from @tbl
     )x(FilteredName)
    

    产量

    名字姓氏

    Rick Pepper
    Lara Harper
    Kim NULL
    Alan White
    Adam Jones
    William NULL
    Clark NULL