2017-05-23 1 views
0

I는 다음과 같습니다 일부 데이터가 :SQL get 및 텍스트

20170101 - Wal-Mart #111-1234-5687789-MC000555555 

20170101 - Target -1235-56444878 - MC000555555 

내가 2 마지막으로, 3 마지막 대시 사이의 문자열을 얻기 위해 SQL 쿼리를 사용하려면를, 그래서 그 결과가 될 것이다.

1234 

1235 

어떻게 수행 할 수 있습니까? 상점의 이름에는 대시가있을 수 있기 때문에 처음부터 대시를 세는 것은 신뢰할 수 없습니다. 내가 모르는 일종의 트릭이없는 한.

감사합니다.

+0

어떤 데이터베이스? SQL 서버? mysql? 신탁? 또는 ansi-sql 솔루션을 원하십니까? – Dekel

+0

첫 샘플 3 ~ 4 번째입니다 – McNets

+0

@McNets 2nd ** last ** 및 3rd ** last ** dash는 OP가 찾고있는 것입니다. – LIvanov

답변

0

대시를 계산하지 않는 한 어떻게 접근 할 수 있을지 잘 모르겠습니다. 상점의 이름 때문에 문자열 시작 부분부터 계산을 시작할 수 없으므로 마지막부터 계산할 수 있습니다. 그래서 다음의 조합이 당신을 위해 일을해야합니다

  • SQL reverse는 - 주어진 주어진 문자의 인덱스를 가져옵니다 - 문자열 (그래서 당신은 "끝에서 계산"수)
  • SQL charindex 반전 문자열
  • SQL substring - 당신은 마지막에서 두 번째와 세 번째 마지막 대시이 도움이

희망, 환호 어디에 알고 일단 당신이 필요한 데이터를 추출 할 수 있습니다.

1
create table test (data varchar(100)); 
insert into test values 
('20170101 - Wal-Mart #111-1234-5687789-MC000555555'), 
('20170101 - Target -1235-56444878 - MC000555555'); 


WITH Rev As 
(
    SELECT REVERSE(data) data 
    FROM test 
) 
, Pos AS 
(
    SELECT data, 
      CHARINDEX('-', data, CHARINDEX('-', data, 0) + 1) + 1 AS PIni, 
      CHARINDEX('-', data, CHARINDEX('-', data, CHARINDEX('-', data, 0)+1)+1) AS PFin 
    FROM Rev 
) 
SELECT REVERSE(SUBSTRING(data, PIni, PFin - PIni)) 
FROM Pos; 
GO 
 
| (No column name) | 
| :--------------- | 
| 1234    | 
| 1235    | 

dbfiddle here

+0

가깝지만, 여분의 대시가 있으면 잘못된 텍스트가 표시된다. REVERSE를 사용하여 원숭이를 시도해 볼 수있는 방법이 있는지 알아볼 것입니다.하지만 이것은 새로운 SQL 영역입니다. – philm

+0

역순으로 얻을 수 있습니다 – McNets

+0

그래, 나는 그것을 반대로했습니다. 나는 리버스 (reverse)를 많이 사용했다. 그러나 그것은 그렇게 작동한다. 수백만 행을 다루지 않기 때문에 비효율적 인 경우 여전히 괜찮습니다. – philm

0

할 수 있습니다이 같은 다른 내부 둥지 하나 SUBSTRING_INDEX() :

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(data,'-',-3),'-',1) FROM `test` 

이 의지 내선 마지막 3 개의 "부분"을 래핑 한 다음 첫 번째 부분을 추출합니다.