UPDATE
我們說不出哪裏 用戶名的開頭是。除非我們可以說「找到 我 第二空間後開始字符」
這是非常簡單的:
- 過濾掉少於 兩個空格(或者字符串,有三個 或更多的話);
- 查找第一個 空間後的位置(或者,第二個單詞的開頭 );
- 找到第一個空格後的第一個空格 (或者,第三個字的起始 )之後的第一個空格後的位置;
- 確定第三個字的長度使用 空間的位置(或字符串的末尾是 只有三個字)的位置;
- 使用上述值與
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;
原來的答案:
是對問題,即用戶名值的位置和/或長度可以不是在數據恆定的,但總是遵循字符串'用戶名'?如果是這樣,您可以使用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) – 2010-06-25 05:03:18
有用閱讀: [tsql正則表達式工作臺](http://www.simple-talk.com/sql/t-sql-programming/tsql-regular-expression-workbench/) – 2010-06-29 12:51:33