2013-10-10 4 views
0

У меня есть большая строка в таблице SQL Server.Режущая строка по шаблону

Пример одной записи строки таблицы:

06.10.2013 22:49:25 [Server Name] INFO - received /192.168.77.14:45643 User-Name: Jon Johnson still something between Client IP: 172.29.5.43 

Но мне нужно просто:

06.10.2013 22:49:25 User-Name: Jon Johnson Client IP: 172.29.5.43 

Как я могу это сделать? Я попытался с PATINDEX но: \

+0

Комбинация 'CHARINDEX' и' SUBSTRING', которые потребуют некоторой настройки, чтобы сделать это правильно. Каковы ваши правила, когда каждая часть начинается или заканчивается? Специально на том, что «все еще что-то между» после имени пользователя - как вы узнали, что имя пользователя закончилось, и что-то еще началось? –

+0

Я говорю, если вы знаете RegEx, вы можете использовать это даже, –

ответ

0

Если строка хорошо сформировавшимися (вы всегда найдете имя лексемы сервера и имя пользователя), вы можете обратиться с PATINDEX, чтобы получить индекс вы хотите, и затем применить SUBSTIRNG так:

Показать Sql Fiddle

select 
substring(description, 1, patindex('%Server Name%', description) - 3) + 
substring(description, patindex('%User-name%', description) + 9, 500) 
from myTable 
0

даты части колонны фиксируется так фиксированная длина может быть извлечена с помощью функции SUBSTRING.

Полный запрос:

SELECT SUBSTRING(fieldname,1,20) + SUBSTRING(fieldname, CHARINDEX('User-Name', 

fieldname), LENGTH(fieldname)-CHARINDEX('User-Name', fieldname)) from table; 
+1

'INSTR' и' CONCAT' не существуют в SQL Server –

+0

@NenadZivkovic, да обновлено. – user1502952

1
SELECT 
LEFT(c, 19) -- fixed length for date-time 
+ ' ' -- separator 
-- now let's find the user-name. 
+ SUBSTRING(c, CHARINDEX('User-Name:',c), CHARINDEX(' still something',c) - CHARINDEX('User-Name:',c)) -- 'User-name:' string must be present only once in the row-column. Replace ' still something' string with the actual content. You use it to delimit the username itself. 
+ ' ' -- separator 
+ SUBSTRING(c, CHARINDEX('Client IP:',c) /* first character position to include */, LEN(c) - CHARINDEX('Client IP:',c) + 1 /* last character position not to include */) -- 'Client IP:' string must be resent only once in the row-column. Expects the IP to be the last part of the string, otherwise use the technique from the username 

-- now the dummy table for the testing 
FROM 
(SELECT '06.10.2013 22:49:25 [Server Name] INFO - received /192.168.77.14:45643 User-Name: Jon Johnson still something between Client IP: 172.29.5.43' AS c) AS t 
0

Вот что-то, что могло бы работать, но вам действительно нужно заменить, что «еще что-то между» с чем-то более твердым:

DECLARE @s NVARCHAR(MAX) 
SET @s = '06.10.2013 22:49:25 [Server Name] INFO - received /192.168.77.14:45643 User-Name: Jon Johnson still something between Client IP: 172.29.5.43' 


SELECT SUBSTRING(@s,0,CHARINDEX('[Server Name]',@s)) --everything up to [Server Name] 
    + SUBSTRING(@s, CHARINDEX('User-Name',@s),CHARINDEX('still something between', @s)-CHARINDEX('User-Name',@s)) --everything from User-Name to 'still something between' 
    + SUBSTRING(@s, CHARINDEX('Client IP',@s),LEN(@s)) --from Client IP till the end 
Смежные вопросы