2013-07-31 2 views
8

아래 열과 같은 문자열이 포함 된 테이블이 있습니다.가변 길이의 하위 문자열

RTSPP_LZ_AEN 
RTSPP_LZ_CPS 
RTSPP_LZ_HOUSTON 
RTSPP_LZ_LCRA 
RTSPP_LZ_NORTH 
RTSPP_LZ_RAYBN 
RTSPP_LZ_SOUTH 
RTSPP_LZ_WEST 
RTSPP_BTE_CC1 
RTSPP_BTE_PUN1 
RTSPP_BTE_PUN2 

나는 문자열의 끝까지 _의 두 번째 발생에서 문자열을 얻을 필요하고 당신이 볼 수있는 문자열은 고정 길이 없습니다. 첫 번째 부분은 항상 고정 될 수있는 것은 아니며 변경할 수 있습니다. 지금은 그것을 달성하기 위해 다음 코드를 사용하고 있습니다.

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,100) 
FROM [Table] 

가변 길이를 처리하기 위해 길이로 임의의 큰 값을 취하고 있습니다. 그것을하는 더 좋은 방법이 있습니까?

+0

항상 정확히 2 개의 밑줄이 있습니까? –

+0

첫 번째 부분은 항상 RTSPP_LZ_입니까 아니면 다른 값을 가질 수 있습니까? –

+0

@AaronBertrand 현재로서는 2 개 이상의 밑줄이있는 사례가 없습니다. 이 경우 문자열의 끝까지 마지막 밑줄이 생길 수 있습니다. 밑줄의 n 번째 발생을 처리 할 수있는 좀 더 일반적인 해결책은 크게 감사 할 것입니다. – Ram

답변

11

당신은 마지막을 찾기 위해 REVERSE 기능과 함께 CHARINDEX을 사용할 수 있습니다 occurrence은 _이고, RIGHT을 사용하면 string의 끝에서 지정된 문자 수를 얻을 수 있습니다.

SELECT RIGHT([String],CHARINDEX('_',REVERSE([String]),0)-1) 

SQLFiddle DEMO

+0

간단한 해결책 및 데모를 주셔서 감사합니다 – Ram

6

할 수 있습니다 마지막 인수로 LEN ([문자열]) 제공하려고 :

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,len([string])) FROM [Table] 
+0

+1 len ([문자열])을 언급 해 주셔서 감사합니다. 나는 그것에 대해 완전히 잊었다. – Ram

0

또는 심지어이 :

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1, 
      LEN([String])-CHARINDEX('_',[String])+1) 
1

당신은 아래의 코드와 같은 일을 할 수있는 공통 테이블 표현식을 사용할 수 있습니다. 문자열에 밑줄이 몇 개라도 상관없이 모든 하위 문자열을 얻을 수있는 유연성이 추가되었습니다.

;WITH cte AS (
    SELECT 
     0 AS row 
     ,CHARINDEX('_', [String]) pos 
     ,[String] 
    FROM [Table] 
    UNION ALL 
    SELECT 
     row + 1 
     ,CHARINDEX('_', [String], pos + 1) 
     ,[String] 
    FROM cte 
    WHERE pos > 0 
) 
SELECT 
    row 
    ,[String] 
    ,pos 
    ,SUBSTRING([String], pos + 1, LEN([String]) -pos) 
FROM cte 
WHERE pos > 0 
-- Remove line below to see all possible substrs 
    AND row = 1 
ORDER BY 
    [String], pos 
+0

+1 답변을 주셔서 감사합니다. 밑줄이 0 인 경우에도 처리하지만 훨씬 더 큰 쿼리의 작은 부분이므로 CTE를 사용할 수 없습니다. – Ram

관련 문제