Разделение столбцов SQL на основе определенных критериев - PullRequest
0 голосов
/ 27 марта 2019

У меня есть таблица, как показано ниже.

Перспективы:

+----------------+---------------+----------------+  
| Account NO   | Contact            | LastName |    
+----------------+---------------+----------------+  
| 1233         | john bar           |  bar        |  
| 2341324      | rich & mary johns  |  johns      |  
| 21343        | wayne & elise smith|  smith      |  
+----------------+---------------+----------------+  

Я пытаюсь создать представление, которое вытянет имена «Джон, богатый и Уэйн» встолбец с именем name, а затем захватывает имена после '&' и помещает их в столбец с именем Spouse, только если есть '&'. Наконец, я бы создал столбец с фамилией.

Итак, столбец супругабудет содержать Марию и Элизу и будет NULL для Джона Бар.

Прямо сейчас я использую нижеприведенное, которое вытаскивает имя и фамилию без проблем. Это также избавляет от '&', ноУ меня проблемы с разделением имени супруга и фамилии в столбце «Супруг»

SELECT  
    ACCOUNTNO,  
    SUBSTRING(Contact, 1, CHARINDEX(' ', Contact)) AS [First],
    SUBSTRING(Contact, CHARINDEX('&', Contact) + 1, LEN(Contact)) AS [Spouse],  
    LASTNAME as Lastname  
FROM Prospects

Мое возвращаемое значение для супруга - «Мэри Джонс» и «Элиз Смит». Я ищу избавиться отфамилия.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Вы можете использовать LEFT и RIGHT для извлечения имени и фамилии, и SUBSTRING для получения необязательного имени супруга, как показано ниже:

SELECT  
    ACCOUNTNO,
    Contact,
    LEFT(Contact, CHARINDEX(' ', Contact) - 1) as First,
    CASE WHEN CHARINDEX(' & ', Contact) > 0
        THEN SUBSTRING(
            Contact, 
            CHARINDEX(' & ', Contact) + 3, 
            LEN(Contact) - CHARINDEX(' ', REVERSE(Contact)) - CHARINDEX(' ', Contact) - 2
        )
    END AS Spouse,
    RIGHT(Contact, CHARINDEX(' ', REVERSE(Contact)) - 1) AS Lastname
FROM Prospects

Демонстрация на DB Fiddle :

ACCOUNTNO | Contact             | First | Spouse | Lastname
--------: | :------------------ | :---- | :----- | :-------
     1233 | john bar            | john  | <em>null</em>   | bar     
    21343 | wayne & elise smith | wayne | elise  | smith   
  2341324 | rich & mary johns   | rich  | mary   | johns   
0 голосов
/ 27 марта 2019

С заменой () и подстрокой ():

select 
  accountno AS [AccountNo],
  substring(contact, 1, charindex(' ', contact) - 1) AS [First],
  case 
    when contact like '% & %' then
      replace(
        replace(contact, ' ' + lastname, ''), 
        substring(contact, 1, charindex(' ', contact) + 2), '') 
    else ''
  end AS [Spouse],
  lastname AS [LastName]
from prospects

См. Демоверсию .
Результаты:

 AccountNo | First | Spouse | LastName
 --------: | :---- | :----- | :-------
      1233 | john  |        | bar     
   2341324 | rich  | mary   | johns   
     21343 | wayne | elise  | smith 
...