Как отмечали другие, вопрос слишком расплывчатый (и описанная проблема слишком сложна), чтобы дать особенно полезный ответ, но я все равно попробую.
Мы можем предложить решение, если сделаем некоторые предположения о значениях имен, которые вы хотите разделить:
- Каждое имя содержит от 2 до 4 «слов», разделенных одним пробелом.
- Образуются 2 названия слов:
[First Name] [Last Name]
- Образуются 3 названия слов:
[First Name] [Last Name] [Suffix]
- Образуются 4 названия слов:
[First Name] [Middle Name] [Last Name] [Suffix]
В этом случае мы могли бы решить следующим образом (если наши имена существуют в таблице с именем names с одним столбцом с именем Name):
SELECT
SUBSTRING(Name, 1, CHARINDEX(' ', Name) - 1) AS FirstName
,CASE LEN(Name) - LEN(REPLACE(Name, ' ', '')) + 1
WHEN 2 THEN NULL
WHEN 3 THEN NULL
WHEN 4 THEN SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name)), 1, CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name))) - 1)
END AS [Middle Name]
,CASE LEN(Name) - LEN(REPLACE(Name, ' ', '')) + 1
WHEN 2 THEN RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name))
WHEN 3 THEN SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name)), 1, CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name))) - 1)
WHEN 4 THEN SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name, CHARINDEX(' ', Name) + 1)), 1, CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name, CHARINDEX(' ', Name) + 1))) - 1)
END AS lastName
,CASE LEN(Name) - LEN(REPLACE(Name, ' ', '')) + 1
WHEN 2 THEN NULL
WHEN 3 THEN REVERSE(SUBSTRING(REVERSE(Name), 1, CHARINDEX(' ', REVERSE(Name)) - 1))
WHEN 4 THEN REVERSE(SUBSTRING(REVERSE(Name), 1, CHARINDEX(' ', REVERSE(Name)) - 1))
END AS Suffix
FROM names
Это не самое элегантное решение, но оно иллюстрирует использование CHARINDEX и SUBSTRING, которые можно применить для разбиения такой строки. Определенно существует некоторая избыточность, которую можно было бы устранить из этого запроса и более элегантных способов его реализации (плюс он может не подходить для вашего набора данных из-за приведенных выше предположений), но, надеюсь, это полезная отправная точка для вас.
Более изящным решением может быть создание функции, которая принимает 2 параметра — строку и целое число, чтобы указать, какое «слово» вы хотите вернуть из этой строки. Затем вы можете вызвать эту функцию из аналогичной CASE логики, чтобы вернуть первое, второе, третье или четвертое слово в имени по мере необходимости.
Если вам нужно иметь возможность обрабатывать имена из трех слов в форме [First Name] [Middle Name] [Last Name] (как я подозреваю, вы это делаете), вы, вероятно, захотите создать список возможных суффиксов и использовать этот список, чтобы определить, имеет ли каждое имя из трех слов суффикс. или отчество соответственно.
person
3N1GM4
schedule
16.11.2016