Извлечение имени и фамилии - PullRequest
7 голосов
/ 28 февраля 2011

У меня есть столбец с именем Name в таблице с именем test, которая имеет полное имя, и я пытаюсь извлечь имя и фамилию. Поэтому я написал запрос примерно так:

SELECT 
[Name],
 LEFT([Name],CHARINDEX(' ',[Name])-1)  AS FIRST_NAME,
SUBSTRING([Name],CHARINDEX(' ',[Name])+1,LEN([Name])) AS LAST_NAME
FROM Test

Но это дает мне ошибку, говоря:

Сообщение 537, уровень 16, состояние 2, строка 1 Недопустимый параметр длины, переданный в функцию LEFT или SUBSTRING.

Это потому, что у меня есть некоторые значения в названии, например:

Имя:

Hopkins

Как мне справиться с этим?

Ответы [ 3 ]

10 голосов
/ 28 февраля 2011
Declare @t table ( [Name] varchar(100) )

insert into @t ( Name )
VALUES ( 'dennis hopper' ), ('keanu reaves'), ('thatgirl') 

SELECT
    [Name],
    CHARINDEX(' ', [Name]),
    CASE WHEN CHARINDEX(' ', [Name]) > 0 THEN
        LEFT([Name],CHARINDEX(' ',[Name])-1)
    ELSE
        [Name]
    END as FIRST_NAME,
    CASE WHEN CHARINDEX(' ', [Name]) > 0 THEN
        SUBSTRING([Name],CHARINDEX(' ',[Name])+1, ( LEN([Name]) - CHARINDEX(' ',[Name])+1) )
    ELSE
        NULL
    END as LAST_NAME
FROM @t
5 голосов
/ 01 марта 2011

Проблема с вашим исходным кодом здесь:

CHARINDEX(' ',[Name])-1

Если [Имя] не содержит пробела, CharIndex возвращает 0. Вы вычитаете 1 и передаете это в функцию Left. Когда второй параметр слева от функции равен -1, вы получите эту ошибку. На мой взгляд, самый простой способ «исправить» эту проблему - это дать функции CharIndex что-то, что можно найти, например:

CHARINDEX(' ',[Name] + ' ')-1

Теперь ... этот код не может завершиться ошибкой.

Вам НУЖНО сделать это одно место в исходном коде, но вы также должны добавить его в часть LAST_NAME. Если вы этого не сделаете, вы получите неправильные результаты (даже если вы не получите ошибку).

SELECT [Name],
       LEFT([Name],CHARINDEX(' ',[Name] + ' ')-1)  AS FIRST_NAME,
       SUBSTRING([Name],CHARINDEX(' ',[Name] + ' ')+1,LEN([Name])) AS LAST_NAME
FROM   Test

Этот запрос вернет те же результаты, что и запрос, предложенный @Sage, но (на мой взгляд) его легче читать и легче понимать.

0 голосов
/ 16 декабря 2014

мы также можем использовать функцию locate

SELECT Name, LEFT (Name, locate ('', Name) -1) AS FIRST_NAME, SUBSTRING (Name, locate ('', Name) + 1, LENgth(Имя)) КАК LAST_NAME ОТ теста

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