SQL разделил имя с подчеркиванием - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь отделить имя от среднего или среднего имени, когда в имени есть подчеркивание.Мне удалось отделить имя от второго имени, когда есть пробел, но возникли проблемы с подчеркиванием.

Я хотел бы сохранить все это вместе в выражении case, если это возможно.

    SELECT 
[first name]
,  SUBSTRING([first name], 1,
                  CASE WHEN SUBSTRING(REVERSE([first name]), 2, 1) = ' '
                       THEN CHARINDEX(' ', [first name]) - 1
                       ELSE LEN([first name])
                  END) AS FirstName ,
        CASE WHEN SUBSTRING(REVERSE([first name]), 2, 1) = ' '
             THEN SUBSTRING([first name], LEN([first name]), 1)
             ELSE NULL
        END AS MiddleName
,   [Last Name]

FROM nametable

enter image description here

Ответы [ 3 ]

3 голосов
/ 18 июня 2019

В следующем примере используются два case выражения для разделения одного столбца на два.Он использует функцию Substring: ошибка не возникает, если указанная длина превышает длину входной строки.

Обратите внимание, что данные образца - это не изображение данных, а полезные данные.

declare @Samples as Table ( Name VarChar(20) );

insert into @Samples ( Name ) values
  ( 'Billy' ), ( 'Billy Bob' ), ( 'Billy_Joe' ), ( 'Edgar_7' ),
  ( '_' ), ( 'X_' ), ( '_Y' ), ( '' );

select Name,
  case
    when CharIndex( '_', Name ) > 0 then Left( Name, CharIndex( '_', Name ) - 1 )
    else Name end as FirstName,
  case
    when CharIndex( '_', Name ) > 0 then Substring( Name, CharIndex( '_', Name ) + 1, 20 )
    else NULL end as MiddleName
  from @Samples;
3 голосов
/ 18 июня 2019

Добавьте встроенную функцию ЗАМЕНА:

 SELECT 
    [first name]
    ,  SUBSTRING([first name], 1,
                      CASE WHEN SUBSTRING(REVERSE(REPLACE([first name], '_', ' ')), 2, 1) = ' '
                           THEN CHARINDEX(' ', REPLACE([first name], '_', ' ')) - 1
                           ELSE LEN([first name])
                      END) AS FirstName ,
            CASE WHEN SUBSTRING(REVERSE(REPLACE([first name], '_', ' ')), 2, 1) = ' '
                 THEN SUBSTRING(REPLACE([first name], '_', ' '), LEN([first name]), 1)
                 ELSE NULL
            END AS MiddleName
    ,   [Last Name]

    FROM nametable
0 голосов
/ 18 июня 2019

Благодаря примерным данным, предоставленным @ HABO , вы можете попробовать это тоже:

SELECT L.Name,
       L.FirstName,
       CASE L.MiddleName WHEN '' THEN NULL ELSE L.MiddleName END AS MiddleName
FROM
(
    SELECT P.Name,
           REPLACE(SUBSTRING(P.UnderscoredName, 1, P.UnderscoreIndex), '_', '') AS FirstName,
           REPLACE(SUBSTRING(P.UnderscoredName, P.UnderscoreIndex, LEN(P.UnderscoredName) - P.UnderscoreIndex + 1),'_','') AS MiddleName
    FROM
    (
        SELECT K.Name,
               K.UnderscoredName,
               CHARINDEX('_', K.UnderscoredName) AS UnderscoreIndex
        FROM
        (
            SELECT Name,
                   REPLACE(CASE WHEN Name LIKE N'%[_]%' THEN Name ELSE Name + '_' END,' ','_') AS UnderscoredName
            FROM @Samples
        ) AS K
    ) AS P
) AS L;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...