2016-08-31 3 views
0

Как получить текст между двумя известными словами?Как получить текст между двумя словами/символами

Sub-выберите пример:

(SELECT TOP(1)Note 
FROM Clients 
WHERE ([email protected]) AND (Note IS NOT NULL) AND (Note NOT LIKE '%Damaged%')) AS Note 

Это возвращает:

Blablabla bla bla blabla bla bla bla (21.08.2015) "some text" word bla bla 
Blablabla bla bla blabla bla bla bla (25.08.2015) "another text" word bla bla 
Blablabla bla bla blabla bla bla bla (28.08.2015) "TEXT I NEED TO GET" word bla bla blabla bla bla. 

Так что мне нужно, чтобы получить текст между последним ")" и последнее "слово"

Пробовал немного магии, но он не работал с последним ")" и последним "словом"

+0

Используете ли вы MS SQL Server? (TOP ...) – jarlh

+0

Да, стандартный SQL-сервер, без MySQL и без Oracle. –

+0

Стандартный SQL (то есть ANSI SQL) <> SQL Server. – jarlh

ответ

0

Ребята я нашел свое собственное решение:

DECLARE @S VARCHAR (MAX) = «Blablabla бла бла блабла бла-бла-бла (21.08.2015) «некоторый текст» слово bla bla Blablabla bla bla blabla bla bla bla (25.08.2015) «другой текст» слово bla bla Blablabla bla bla blabla bla bla bla (28.08.2015) «ТЕКСТ, КОТОРЫЙ НУЖДАЕТСЯ ПОЛУЧИТЬ "слово bla bla blabla bla bla.'

ВЫБРАТЬ LEFT (REVERSE (LEFT (REVERSE (@S), CHARINDEX (')», REVERSE (@S)) ​​- 2)) + 'слово', CHARINDEX ('слово', REVERSE (LEFT (REVERSE (@S), CHARINDEX (')', REVERSE (@S)) ​​- 2)) + 'слово') - 1) AS отвечают

Это возвращает именно:

" ТЕКСТ, КОТОРЫЙ НУЖНО ПОЛУЧИТЬ "

Спасибо всем, что привело меня к этому вопросу.

+0

Привет, ваше простое решение совсем не отличается от моего. Самое важное отличие состоит в том, что вы повторяете одни и те же вызовы функций. Мой подход с «CROSS APPLY» - по крайней мере в моих глазах - гораздо легче читать, из-за того, что промежуточные результаты используются с * именем *, в то время как у вас есть глубоко вложенная функция function-in-function-in -рекомендуемая функция * код. Вы используете два раза LEFT, в то время как я использую 'SUBSTRING' и вычисляю длину. То, что вы принимаете как легко, - личное мнение. Я не хотел бы поддерживать вашу функцию через несколько месяцев :-) – Shnugo

1

Возможно, что-то вроде этого:

Вы пытаетесь найти сообщение последнее появление. Это первый в Откачено строки ...

--This является макет вашего стола, чтобы держать ваши строки:

DECLARE @tbl TABLE(YourLine VARCHAR(100)); 
INSERT INTO @tbl VALUES 
('Blablabla bla bla blabla bla bla bla (21.08.2015) "some text" word bla bla') 
,('Blablabla bla bla blabla bla bla bla (25.08.2015) "another text" word bla bla') 
,('Blablabla bla bla blabla bla bla bla (28.08.2015) "TEXT I NEED TO GET" word bla bla blabla bla bla.'); 

--Here Я указать слово, которое вы ищете

DECLARE @SearchWord VARCHAR(100)='word'; 

--This является запрос

SELECT REVERSE(C.CutOut) AS YourSnippet 
FROM @tbl AS tbl 

- CROSS APPLY работает по рядам: Возьмите текущую строку и верните его!

CROSS APPLY(SELECT REVERSE(tbl.YourLine) AS RevLine) AS A 

--find первого вхождение ) и первого вхождение в вернулись Поиск слова!

CROSS APPLY(SELECT CHARINDEX(')',A.RevLine) AS PosParanthesis 
        ,CHARINDEX(REVERSE(@SearchWord),A.RevLine) AS PosWord) AS B 

--cut струны в положении найдено длине, рассчитанной

CROSS APPLY(SELECT SUBSTRING(A.RevLine,B.PosWord + LEN(@SearchWord)+1,B.PosParanthesis-B.PosWord-LEN(@SearchWord)-1) AS CutOut) AS C 

Результат LAS CROSS APPLY является вашей целевой строкой, но не наоборот. Поэтому последний обратный в главном SELECT ...

+0

+1 и -1 в SUBSTRING удаляют пробел после «слова» в результате. Вы можете утверждать, что это пространство должно быть включено и, таким образом, удалить +1 и -1. Это приведет к результатам с @SearchWord = 'ord', включая w. – larsts

+0

Это выглядит так сложно. –

+0

Привет @ J.Adam, это совсем не сложно ... Ключом является моя вторая строка о возврате строки. 'REVERSE ('hello')' возвращает 'olleh'. Смотрите мои правки – Shnugo

0
declare @start varchar(100) 
set @start = 'startword' 

declare @end varchar(100) 
set @end = 'endword' 

SELECT TOP(1) Note , substring(LEFT(note, charindex(@end, note, CHARINDEX(@start, note))-1), CHARINDEX(@start, note) + len(@start), LEN(note)) result 
FROM Clients 
WHERE ([email protected]) AND (Note IS NOT NULL) 
+0

Выглядит отлично, но он возвращает только первый случай моего текста между #start и #end. Как я могу получить последний? –

+0

Последнее означает конечное слово? – FakeisMe

+0

Текст, который мне нужен, находится между последним «)» и последним «словом». Ваш запрос возвращает текст между первым «)» и первым «словом». Если вы измените только конечное слово, оно вернет все между последним «словом» и кулаком »)« правильно? Но я также замечаю, где только один »)» и «одно слово». Но когда есть еще, все равно нужен последний. –

0
CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @id int , , 
    @sword varchar(30) , 
    @delimiter varchar(30) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) , id int 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    declare @start1 varchar(100) 
    set @start1 = @sword 

    declare @end1 varchar(100) 
    set @end1 = @delimiter 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) + Len(@delimiter) - 1 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata , id) 
     VALUES(substring(LEFT((SUBSTRING(@string, @start, @end - @start)), charindex(@end1, (SUBSTRING(@string, @start, @end - @start)), CHARINDEX(@start1, (SUBSTRING(@string, @start, @end - @start))))-1), CHARINDEX(@start1, (SUBSTRING(@string, @start, @end - @start))) + len(@start1), LEN((SUBSTRING(@string, @start, @end - @start)))) ,@id) 

     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start)+ Len(@delimiter) - 1 
     END 
    RETURN 
END 

Select note , fnSplitString (note , id ,'startword', 'endword') from clients 
+0

Я создал функцию, которая должна разделить вашу строку, используя конечное слово, а затем попытаться взять значение между первым и последним. Посмотрите, работает ли это для u. Спасибо – FakeisMe

+0

Это процедурное мышление способ усложнить. Вы действительно должны избегать циклов, где они вам не нужны ... – Shnugo

+0

Благодарим за сообщение. Но я нашел «более простой» способ. –

Смежные вопросы