2011-10-18 4 views
0

:테라 데이타 문자열 조작 (제 2 공간) 나는 큰 어려움이 겉으로는 쉬운 일이 해결하는 데

목적 : 중간 초기

예를 제거하는 쿼리를 만듭니다

Name 
Smith, John A 
Jane, Mary S 

I을 다음과 같은 출력을 원합니다.

테라 데이타 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))))) 

답변

0

을 도전은 확실히 당신의 이름은 지속적으로 포맷하고있다. (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; 

는 또 다른 옵션은 오른쪽 N을 반환하는 UDF를 구현하는 것 문자열의 문자. (예 : RIGHT(FullName, n))

형식이 일치하지 않으면 덜 비싼 다른 옵션을 살펴 봐야합니다.

희망이 도움이됩니다.

1
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