Teradata String Manipulation (Второе пространство) - PullRequest
0 голосов
/ 18 октября 2011

Мне трудно решить эту, казалось бы, простую задачу:

Назначение: Создайте запрос, который устраняет середину Initial

Пример

Name
Smith, John A
Jane, Mary S

Я хотел бы получить такой вывод:

Name
Smith, John
Jane, Mary

Любые советы о том, как это сделать с помощью Teradata SQL

Полагаю, я решил проблему, хотя и очень плохо:

SELECT SUBSTR('SMITH, JOHN A', 0, (POSITION(' ' IN 'SMITH, JOHN A') + (POSITION(' ' IN SUBSTR('SMITH, JOHN A',(POSITION(' ' IN 'SMITH, JOHN A'))+ 1,50)))))

Ответы [ 2 ]

1 голос
/ 22 февраля 2012
select a,
substr(a,1,index(a,' '))|| substr(trim(substr(a,index(a,' '))),1,index(trim(substr(a,index(a,' '))),' ')),
substr(trim(substr(a,index(a,' '))),index(trim(substr(a,index(a,' '))),' ')) last_name
from a
0 голосов
/ 18 октября 2011

Задача состоит в том, чтобы убедиться, что ваши имена последовательно отформатированы. (Last_Name, Given_Name Middle_Initial) Если это так, вы можете решить эту проблему с помощью рекурсивного SQL. Следующий SQL примет Given_Name Last_Name и вернет Last_Name. Возможно, вы сможете настроить его для выполнения вашей конкретной задачи. (Мои образцы данных не были отформатированы последовательно, поэтому я застрял, пытаясь найти второе (или третье) вхождение символа пробела.)

WITH RECURSIVE cte (FullName, DelimPosition, RecursionLevel, Element, Remainder) AS
(
  SELECT FullName
       , 0 AS DelimPosition_
       , 0 
       , CAST('' AS VARCHAR(128))
       , FullName
    FROM MyDatabase.Persons

  UNION ALL

  SELECT FullName
       , CASE WHEN POSITION(' ' IN Remainder) > 0
              THEN POSITION(' ' IN Remainder)
              ELSE CHARACTER_LENGTH(Remainder)
         END DelimPosition_
       , RecursionLevel + 1
       , SUBSTRING(Remainder FROM 0 FOR DelimPosition_ + 1)
       , SUBSTRING(Remainder FROM DelimPosition_ + 1)
    FROM cte
   WHERE DelimPosition_ > 1
     AND RecursionLevel < 3 -- Set max depth
)
SELECT FullName
     , CASE WHEN POSITION('&' IN Element) = 0
            THEN Element 
            ELSE NULL
       END AS LastName
  FROM cte c
 WHERE RecursionLevel > 2
 ORDER BY FullName;

Другой вариант - реализовать UDF, который возвращает самые правые n символов строки. (Например, RIGHT(FullName, n)) * +1010 *

Если форматирование не соответствует, тогда мы должны рассмотреть другие менее изящные варианты.

Надеюсь, это поможет.

...