UPDATE
우리는 어디 말할 수 없다 사용자 이름의 시작은입니다.우리는 매우 간단
' 나에게 제 2 공간 후에 시작 문자 찾기'말할 수없는 한 :
- 양자 택일 (미만 이 공백이 문자열을 필터링 세 이 또는 더 많은 단어들);
- 첫 번째 공백 다음에 위치를 찾습니다 (또는 두 번째 단어의 시작 부분에 ).
- 첫 번째 공백 후 공백 뒤에 위치를 찾으십시오 ( (또는 세 번째 단어의 시작 부분).
- 다음 공백의 위치를 사용하여 세 번째 단어의 길이를 결정하십시오 (또는 문자열의 끝은 이며 세 단어 만 있습니다).
- 위의 값을
SUBSTRING()
함수와 함께 사용하면 세 번째 단어를 반환 할 수 있습니다. 가
예 :
WITH MyTable (ColumnName)
AS
(
SELECT NULL
UNION ALL
SELECT ''
UNION ALL
SELECT 'One.'
UNION ALL
SELECT 'Two words.'
UNION ALL
SELECT 'Three word sentence.'
UNION ALL
SELECT 'Sentence containing four words.'
UNION ALL
SELECT 'Five words in this sentence.'
UNION ALL
SELECT 'Sentence containing more than five words.'
),
AtLeastThreeWords (ColumnName, pos_word_2_start)
AS
(
SELECT M1.ColumnName, CHARINDEX(' ', M1.ColumnName) + LEN(' ') + 1
FROM MyTable AS M1
WHERE LEN(M1.ColumnName) - LEN(REPLACE(M1.ColumnName, ' ', '')) >= 2
),
MyTable2 (ColumnName, pos_word_3_start)
AS
(
SELECT M1.ColumnName,
CHARINDEX(' ', M1.ColumnName, pos_word_2_start) + LEN(' ') + 1
FROM AtLeastThreeWords AS M1
),
MyTable3 (ColumnName, pos_word_3_start, pos_word_3_end)
AS
(
SELECT M1.ColumnName, M1.pos_word_3_start,
CHARINDEX(' ', M1.ColumnName, pos_word_3_start) + LEN(' ')
FROM MyTable2 AS M1
),
MyTable4 (ColumnName, pos_word_3_start, word_3_length)
AS
(
SELECT M1.ColumnName, M1.pos_word_3_start,
CASE
WHEN pos_word_3_start < pos_word_3_end
THEN pos_word_3_end - pos_word_3_start
ELSE LEN(M1.ColumnName) - pos_word_3_start + 1
END
FROM MyTable3 AS M1
)
SELECT M1.ColumnName,
SUBSTRING(M1.ColumnName, pos_word_3_start, word_3_length)
AS word_3
FROM MyTable4 AS M1;
가
ORIGINAL ANSWER :
항상 자명 값의 위치 및/또는 길이의 데이터가 일정하지 않을 수 있다는 문제가 있지만,이 다음에 string 'username'? 그렇다면 CHARINDEX
과 SUBSTRING
을 같이 사용할 수 있습니다.
WITH MyTable (ColumnName)
AS
(
SELECT 'Error 192.168.1.67 UserName 0bce6c62-1efb-416d-bce5-71c3c8247b75 An existing ....'
UNION ALL
SELECT 'Username onedaywhen is invalid'
),
MyTable1 (ColumnName, pos1)
AS
(
SELECT M1.ColumnName, CHARINDEX('UserName ', M1.ColumnName) + LEN('UserName ') + 1
FROM MyTable AS M1
),
MyTable2 (ColumnName, pos1, pos2)
AS
(
SELECT M1.ColumnName, M1.pos1,
CHARINDEX(' ', M1.ColumnName, pos1) - M1.pos1
FROM MyTable1 AS M1
)
SELECT SUBSTRING(M1.ColumnName, M1.pos1, M1.pos2)
FROM MyTable2 AS M1;
... 예를 들어 더욱 강력하게 만들 필요가 있습니다. 사용자 이름 값 뒤에 후행 공백이 없을 때
가능한 [SQL Server 내 정규 표현식] (http://stackoverflow.com/questions/1964124/regular-expression-inside-sql-server) –
유용합니다. 읽기 : [tsql 정규식 워크 벤치] (http://www.simple-talk.com/sql/t-sql-programming/tsql-regular-expression-workbench/) –