2017-09-03 11 views
0

다음 SQL 결과 항목이 있습니다.텍스트 열에서 중첩 된 문자열 추출

Result 
--------- 
TW - 5657980 Due Date updated : to <strong>2017-08-13 10:21:00</strong> by <strong>System</strong> 
TW - 5657980 Priority updated from <strong> Medium</strong> to <strong>Low</strong> by <strong>System</strong> 
TW - 5657980 Material added: <strong>1000 : Cash in Bank - Operating (Old)/ QTY:2</strong> by <strong>System</strong>#9243 
TW - 5657980 Labor added <strong>Kelsey Franks/14:00 hours </strong> by <strong>System</strong>#65197 

이제이 결과에서 간단한 설명을 추출하고 동일한 테이블의 다른 열로 마이그레이션하려고합니다.

Expected result 
-------------- 
Due Date Updated 
Priority Updated 
Material Added 
Labor Added 

처음 13자를 무시합니다. 대부분의 경우 '업데이트 됨'으로 끝납니다. '추가됨'으로 끝나는 항목이 거의 없습니다. 대소 문자를 구별하지 않아야합니다.
예상되는 결과를 얻는 방법이 있습니까?

+0

작업을 정의하는 데 필요한 정보가 충분하지 않습니다. –

+0

@Erwin : SQL에서 문자열을 추출하고 언급 된 결과를 기대합니다. –

+0

중요한 정보 누락 : "간단한 설명"이 항상 "업데이트 됨"또는 "추가됨"으로 끝나나요? 대소 문자를 구분합니까? (그리고이 단어들 중 한 번 이상 나타나는 단어는 없습니까?) 우리가 무시하는 주요 부분은 항상 정확하게 13 자 길이입니까? 또는 문자열의 시작과 끝이 정확히 어떻게 정의되어 있습니까? –

답변

1

해결 방법 substring() 정규 표현식을 사용합니다. 은 처음 13 자을 건너 뛴 다음 첫 번째 'updated' 또는 '이' '이 추가되고 선행 공백이있는 문자열을 가져옵니다. 그렇지 NULL :

SELECT substring(result, '(?i)^.{13}(.*? (?:updated|added))') 
FROM tbl; 

정규 표현식은 다음과 같이 설명

(?i) .. meta-syntax을 제 13 자에게 이동 .. 대소 문자 구별이
^ .. 문자열
.{13} 개시 일치로 전환
() .. 캡쳐 괄호 (캡쳐 페이로드)
.*? .. 임의의 문자 수 (non-greedy)
(?:) .. 비 캡처 괄호
(?:updated|added) .. 2 가지 (문자열 우리가 13 개 주요 캐릭터 like you later commented에 의존 할 수없는 경우)


'업데이트'또는 '추가'로 끝나는, 우리는 몇 가지가 필요합니다 대신 다른 신뢰할 수있는 정의. 귀하의 어려움은 실제 구현보다 흐린 요구 사항으로 보입니다. 숫자
위한

SELECT substring(result, '(?i)^\D+\d+ (.*? (?:updated|added))') ... 

\d .. 클래스 단축형 정의한 바와

말, 우리는 하나 개 이상의 숫자 공백 다음 페이로드 뒤에 하나 이상의 비 - 숫자 다루는 \D .. 자릿수가 아닌 자릿수입니다. \d

+0

정보 주셔서 감사합니다. 13 자 길이를 찾을 수 있습니까? 나는 그 12-11 문자가 잘못된 결과를 준다면 그것을 발견했다. –

+0

길이가 동적 인 문자를 얻으면 좋을 것입니다. 때때로 10, 11, 12 또는 13입니다. –

+0

@PranavUnde : 가능한 모든 질문에 * 완전한 정보를 주시면됩니다. 위치 14가 아닌 경우 문자열의 시작을 정의하는 것은 무엇입니까? 첫번째 자릿수 뒤의 첫 번째 자릿수와 공백? 내 생각에 근거한 다른 솔루션을 추가했습니다. –