2010-12-10 3 views
1

У меня есть столбец в базе данных под названием Полное имя, и я хочу разделить это имя как FirstName и LastName:T-SQL Query Проблема

Вот пример:

ПолноеИмя Сэм Питер

I хотим, чтобы это

FirstName LastName 
-------------------- 
Sam   Peter 

Но проблема в том, некоторые из столбцов в базе данных имеют полные имена Как это

FullName 
-------- 
Sam George Jack Peter 
Sam Adam Peter 

Я хочу, чтобы это было

FirstName   LastName 
---------   -------- 
Sam George Jack  Peter 
Sam Adam   Peter 

Как я пишу T-SQL-запрос для этого.

Заранее спасибо за помощь

ответ

2

Там очень тщательный разбор имя рутины описаны в this answer. Он справляется с вашей ситуацией, а также с более сложными делами, такими как «Mr. Martin J Van Buren III».

0

манипуляции строки в SQL Server, как известно, слабым.

Лучше всего сделать это в своем прикладном уровне.

Для вашего примера с более чем двумя именами, как вы знаете, в какие поля входят эти дополнительные имена? Вы гарантированы, что у них всегда будет только одна фамилия?

+0

В моем случае я знаю, что у него есть только одна фамилия – Sam

0

Нашел на сети (не проверял)

REVERSE(SUBSTRING(REVERSE([FullName]),1,FINDSTRING(REVERSE([FullName])," ",1))) 

Вы можете проверить его с

SELECT REVERSE(SUBSTRING(REVERSE([FullName]),1,FINDSTRING(REVERSE([FullName])," ",1))) 
FROM Table 

, если он работает вы можете

UPDATE Table 
SET LastName = REVERSE(SUBSTRING(REVERSE([FullName]),1,FINDSTRING(REVERSE([FullName])," ",1))) 

Я оставляю упражнения для вашего имени.

+0

Не работает. Но спасибо за вашу помощь – Sam

0

Вы просто раскалываетесь в последнем пространстве? Если так это должно работать:

select 'Sam George Jack Peter' as FullName 
into #names 
union select 'Sam Adam Peter' 

select LEFT(FullName,LEN(FullName)-CHARINDEX(' ',REVERSE(FullName))) as FirstName 
    ,RIGHT(FullName,CHARINDEX(' ',REVERSE(FullName))-1) as LastName 
from #names 

EDIT: Для обработки имен без пробелов и поставить FullName, как LastName

select 'Sam George Jack Peter' as FullName 
into #names 
union select 'Sam Adam Peter' 
union select 'Peter' 

select CASE 
      WHEN CHARINDEX(' ',FullName) = 0 THEN '' 
      ELSE LEFT(FullName,LEN(FullName)-CHARINDEX(' ',REVERSE(FullName))) 
     END as FirstName 
     ,CASE 
      WHEN CHARINDEX(' ',FullName) = 0 THEN FullName 
      ELSE LTRIM(RIGHT(FullName,CHARINDEX(' ',REVERSE(FullName)))) 
     END as LastName 
from #names 
+0

Но у меня так много столбцов, как это. Нужно ли писать запись для каждой записи? – Sam

+0

Это дает мне следующую ошибку: Msg 536, Level 16, State 2, Line 1 Неверный параметр длины передан в функцию RIGHT. – Sam

+1

@Sam, как только вы получите синтаксис справа, вы можете написать определенную пользователем функцию и пользователя, который http://www.databasejournal.com/features/mssql/article.php/3348181/User-Defined-Functions-in-Microsoft-SQL -Server-2000.htm – Unreason