2016-07-24 2 views
0

У меня есть блок текста с несколькими предложениями, и я хочу разделить их и показать каждое предложение на новой строке. Я пробовал использовать CHARINDEX и SUBSTRING, но как только вы получите второе предложение, код становится очень сложным и сложным для повторения. Здесь я получил два и отказался, понимая, что код собирался быстро снежный ком:Как разделить блок текста на отдельные предложения на SQL-сервере?

DECLARE @TEXT NVARCHAR(MAX) = 'Has many applications. The price is low. The quality is good. Availability is widespread.' 
DECLARE @TEXTLine1 NVARCHAR(MAX) = LEFT(@TEXT,CHARINDEX('.',@TEXT)) 
DECLARE @TEXTLine2 NVARCHAR(MAX) = SUBSTRING(@TEXT,CHARINDEX('.',@TEXT)+2,CHARINDEX('.',SUBSTRING(@TEXT,CHARINDEX('.',@TEXT)+2,50))) 
PRINT @TEXTLine1 
PRINT @TEXTLine2 

Как вы можете видеть, я разделив предложения на основе полной остановки. Есть ли способ сказать SUBSTRING найти «n-й» экземпляр персонажа? Это упростит задачу.

ответ

0

С помощью функции синтаксического анализа

Declare @TEXT VarChar(max) = 'Price if $15.25 is NOT split. Has many applications. The price is low. The quality is good. Availability is widespread.' 

Select * from [dbo].[udf-Str-Parse](@Text,'. ') 

Возвращает

Key_PS Key_Value 
1  Price if $15.25 is NOT split 
2  Has many applications 
3  The price is low 
4  The quality is good 
5  Availability is widespread. 

ОДС

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@delimeter varchar(10)) 
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--  Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 
--  Select * from [dbo].[udf-Str-Parse]('id26,id46|id658,id967','|') 

Returns @ReturnTable Table (Key_PS int IDENTITY(1,1) NOT NULL , Key_Value varchar(max)) 

As 

Begin 
    Declare @intPos int,@SubStr varchar(max) 
    Set @IntPos = CharIndex(@delimeter, @String) 
    Set @String = Replace(@String,@[email protected],@delimeter) 
    While @IntPos > 0 
     Begin 
     Set @SubStr = Substring(@String, 0, @IntPos) 
     Insert into @ReturnTable (Key_Value) values (@SubStr) 
     Set @String = Replace(@String, @SubStr + @delimeter, '') 
     Set @IntPos = CharIndex(@delimeter, @String) 
     End 
    Insert into @ReturnTable (Key_Value) values (@String) 
    Return 
End 
+0

Совершенная! Я не думал о десятичных знаках. Все, что мне нужно было добавить, это: IIF (right (Key_value, 1) = '.', Key_value, Key_value + '.'), Чтобы убедиться, что все строки вернулись с полной остановкой в ​​конце. – SteelyDanFan

+0

Счастливые помочь. В прошлом я был укушен этой собакой. Приветствия. –

+0

Играла с этим сегодня - что делает линия «Set @String = Replace (@ String, @ delimeter + @ delimeter, @ delimeter)» делать? – SteelyDanFan

0

При рассмотрении моего вопроса я пришел с этим - это кажется немного излишним, но я не могу думать о какой-либо другой способ:

DECLARE @text NVARCHAR(MAX) = 'Has many applications. The price is low. The quality is good. Availability is widespread.'; --Set text. 
DECLARE @text2 NVARCHAR(MAX) = LEFT(@text,CHARINDEX('.',@text)); --Extract first sentence. 

PRINT @text2; --Print first sentence. 

SET @text = RIGHT(@text,LEN(@text)-LEN(@text2)); --Subtract @text2 from @text - will include the space at the begining that was after the first full stop. 

WHILE LEN(@text) >0 
BEGIN 
SET @text = RIGHT(@text, LEN(@text)-1);--Take of the space that after the full stop in previous iteration of @text. 
SET @text2 = LEFT(@text,CHARINDEX('.',@text));--Exract the 'new' first sentence. 
PRINT @text2; 
SET @text = RIGHT(@text,LEN(@text)-LEN(@text2)); --Subtract @text2 from @text - will include the space at the begining that was after the first full stop. 
END; 

Другие предложения приветствуются.

EDIT - отличный ответ Джона Каппельлетти побудил меня улучшить свои собственные. Теперь он не улавливается десятичными знаками и также может распознавать возврат каретки. Будет иметь различное приложение, но подумал, что может быть полезно включить для тех, кто ищет решение.

DECLARE @text NVARCHAR(MAX) = 
'I would like to pay £22.99. Has many applications. 
£45.00 is good value. The price is low. The quality is good. 
Availability is widespread. Good value at £5.00.' --Set text. 
DECLARE @text2 NVARCHAR(MAX) = LEFT(@text,CHARINDEX('. ',@text)) --Extract first sentence. 


PRINT @text2 --Print first sentence. 
SET @text = RIGHT(@text,LEN(@text)-LEN(@text2)) --Subtract @text2 from @text - will include the space at the begining that was after the first full stop. 
WHILE LEN(@text) >0 
BEGIN 
SET @text = RIGHT(@text, LEN(@text)-1)--Take off the space that after the full stop in previous iteration of @text. 
SET @text2 = IIF(LEN(LEFT(@text,CHARINDEX('. ',@text)))=0, LEFT(@text,CHARINDEX('.',@text)+LEN(RIGHT(@text, LEN(@text)-LEN(LEFT(@text,CHARINDEX('.',@text)))))),LEFT(@text,CHARINDEX('. ',@text)))--Extract the new first sentence. 
PRINT @text2 
SET @text = RIGHT(@text,LEN(@text)-LEN(@text2)) --Subtract @text2 from @text - will include the space at the begining that was after the first full stop. 
END 
2

использовать один из разрезных строковых функций из here ..

Тогда это было бы очень легко сделать, как это ..

DECLARE @TEXT NVARCHAR(MAX) = 'Has many applications. The price is low. The quality is good. Availability is widespread.' 

select * from 
[dbo].[SplitStrings_Numbers](@text,'.') 

Выход:

Item 
Has many applications 
The price is low 
The quality is good 
Availability is widespread