Удалить и разбить данные на несколько столбцов в операторе выбора - PullRequest
2 голосов
/ 15 ноября 2009

У меня есть данные, подобные следующей таблице

alt text

Я хочу удалить заголовки (Mr. Miss, Dr и т. Д.) Из имени и хочу разделить данные на Имя и Фамилию, если существуют два имени.

Я хочу это в утверждении select. Я могу удалить заголовок, используя оператор CASE, но не могу разделить имя на буксир в том же операторе case.

Мне нужны такие данные, но в операторе выбора заголовок удален, а имя разделено.

alt text

Ответы [ 4 ]

2 голосов
/ 15 ноября 2009

Вы можете сделать это довольно легко с помощью подстроки. Вы хотите разделить строку пробелами, а затем игнорировать первый элемент в индексе, примерно так:

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

Не проверено, но это довольно близко к тому, что вы хотите сделать. Вы будете разбивать строку на массив вроде:

[0] Префикс [1] Имя [2] Фамилия

И только захват 1 и 2. Это сломается, однако, если нет префикса.

1 голос
/ 15 ноября 2009

Попробуйте следующий 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')

Извлечение имен может быть очень сложным, поскольку существует большое количество возможных префиксов, иногда имена сохраняются в первую очередь. Некоторые имена имеют суффиксы, такие как младший или доктор философии. Надеюсь, этот UDF даст вам отправную точку ...

0 голосов
/ 15 ноября 2009

Попробуйте это

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
0 голосов
/ 15 ноября 2009

Вы можете объединить ответ Джереми с каскадными утверждениями CASE, чтобы удовлетворить ваши требования. Это будет довольно сложное предложение, но оно может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...