Я пытаюсь очистить данные в поле «Имя» в нашей базе данных и разбить эти данные на FirstName, MiddleName, & LastName. В настоящее время я использую оператор Case
для поиска различных триггеров внутри текста, чтобы помочь мне форматировать вывод определенным образом.Как рекурсивно анализировать данные в операторе SQL
Однако я начинаю замечать, что я тестировал тесты внутри других тестов и должен выяснить, как обрабатывать данные рекурсивно. См. Этот пример того, как я извлекаю FirstName.
Case
When CharIndex(' ',LTrim(RTrim(Name))) in (0,1) Then '' --'empty or LName'
When Left(Name,3) IN ('MR ','MS ', 'DR ','MRS') Then --'Prefix Titles'
Case --'If we found a prefix, run the same "tests" with the prefix removed'
When CharIndex(' ',LTrim(RTrim(Right(Name,Len(Name)-CharIndex(' ',Name)))))
in (0,1) Then ''
When SubString(LTrim(RTrim(Right(Name,Len(Name)-CharIndex(' ',Name)))),3,1)
= '&' Then SubString(LTrim(RTrim(Right(Name,Len(Name)-CharIndex(' ',
Name)))),1,5)
Else Left(LTrim(RTrim(Right(Name,Len(Name)-CharIndex(' ',Name)))),
CHarIndex(' ',LTrim(RTrim(Right(Name,Len(Name)-CharIndex(' ',Name)))))-1)
End
When SubString(LTrim(RTrim(Name)),3,1) = '&' Then
SubString(LTrim(RTrim(Name)),1,5) --'Look for initials e.g. J & A Smith'
Else Left(LTrim(RTrim(Name)),CHarIndex(' ',LTrim(RTrim(Name)))-1)
End
Итак, для того, чтобы получить эту работу в более сложных ситуациях (например, MR JOHN A SMITH JR
), я должен был бы проверить рекурсивно. В императивном программировании, я хотел бы сделать что-то вроде этого, если бы я имел функцию под названием GetFirstName
:
GetFirstName('MR JOHN A SMITH JR')
//GetFirstName identfies 'MR' and within the function it calls:
||
\\
==> GetFirstName('JOHN A SMITH JR')
//GetFirstName identifies 'JR' and within the function it calls:
||
\\
==> GetFirstName('JOHN A SMITH')
//Finally, it returns 'JOHN'
В идеале было бы здорово сделать это в прямом SQL, но я не уверен, что это возможно. Какие альтернативы у меня есть, если я не использую прямой SQL? (Я использую SQL Server 2005)
Это задача, которая лучше обрабатывается в коде приложения, а не в SQL. –