sql разбирает полное имя поля на первый, средний, последний и суффикс - PullRequest
0 голосов
/ 14 декабря 2010

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

Msg 537, Level 16, State 3, Line 1
Invalid length parameter passed to the LEFT or SUBSTRING function.

Таблица SpaceComma получает правильные индексы.Это формат имен, которые у меня есть:

    CREATE TABLE #myfullnames (fullName VARCHAR(50))
    GO

    INSERT #myfullnames VALUES ('BROOK SR, JAMES P.')
    INSERT #myfullnames VALUES ('BLOCK JR., BILL V.')
    INSERT #myfullnames VALUES ('MOOR, CLODE M.')
    INSERT #myfullnames VALUES ('SOUDER III, Laurence R.')
    INSERT #myfullnames VALUES ('SOUDER, WILL' )
    INSERT #myfullnames VALUES ('KOLIV, Kevin E.')
    INSERT #myfullnames VALUES ('Simk, JR. Thomas Todd')
    INSERT #myfullnames VALUES ('Polio, Gary R.')

Буду признателен за вашу помощь.Спасибо.

 select SplitNames.LastName, SplitNames.FirstName, 
        SplitNames.MiddleName, SplitNames.Title
 from (
    select [fullName]
, substring([fullName], 1, SpceTitle-1) as LastName
, substring([fullName], SpceMid,(SpceMid - SpceFirstName - 1)) as FirstName
, substring([fullName], SpaceComma.SpceTitle, (SpaceComma.SpceFirstName -   
    SpaceComma.SpceTitle)) as Title
, nullif(substring([fullName],SpaceComma.SpceMid+1,100),'') as    
    MiddleName      
from (
    select [fullName],
    charindex(',',[fullName]) as Comma,
    charindex(' ',[fullName]+space(1),charindex(',',[fullName])) as
            SpceFirstName,
    (len([fullName]) + 1 - charindex(' ',reverse([fullName]), 0)) as
            SpceMid,        
    charindex(' ',[fullName], charindex (' ',reverse([fullName]))) as SpceTitle
    from #myfullnames   
     ) SpaceComma
 ) SplitNames

 DROP TABLE #myfullnames

1 Ответ

0 голосов
/ 14 декабря 2010

Данные в вашем примере не соответствуют ни одному фиксированному набору правил, поэтому не будет идеального решения для анализа имен. Пример нарушения правила - между «Simk» и «BLOCK» в том смысле, что «JR» находится внутри запятой на одном, а не на другом. Единственное решение проблемы нарушения правил - вручную исправить нарушителей.

Мы можем проанализировать имя, используя функцию «PARSENAME» в SQL Server. SQL Server использует PARSENAME для разделения SERVERNAME.DATABASE.SCHEMA.TABLE и ограничен четырьмя частями.

Вот запрос, который анализирует имена

select fullname
 , REPLACE(fullname,'.','') AS [1] 
 , REPLACE(REPLACE(fullname,'.',''),', ','.') AS [2]
 , ParseName(REPLACE(REPLACE(fullname,'.',''),', ','.'),2) AS [3]
 , REPLACE(ParseName(REPLACE(REPLACE(fullname,'.',''),', ','.'),1),' ','.') AS [4]
 , PARSENAME(REPLACE(ParseName(REPLACE(REPLACE(fullname,'.',''),', ','.'),1),' ','.'),1) AS [5]
 , PARSENAME(REPLACE(ParseName(REPLACE(REPLACE(fullname,'.',''),', ','.'),1),' ','.'),2) AS [6]
 from #myfullnames

В шести выходных столбцах показано использование замены символов на «.» затем используя PARSENAME для извлечения части строки.

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