Разделить строку SQL на слова - PullRequest
1 голос
/ 04 мая 2011

Я хочу разбить строку на слова, как показано ниже, вывод всей строки должен быть одинаковым:

INPUT:

 1. This is a string
 2. This    is   a   string
 3. This  is a          string
 4. This  is           a string

ВЫВОД:

Это

Означает, что я хочу первые три слова из предложения, независимо от пробелов.

Ответы [ 4 ]

3 голосов
/ 04 мая 2011

Попробуйте это:

declare @s1 varchar(3000) ;
declare @xml xml,@str varchar(100),@delimiter varchar(10), @out varchar(max);;
select @delimiter =' '
select @s1 =  'This is a string';
select @s1 = 'This    is   a   string ';
select @s1 = 'This  is a          string ';
select @s1 = 'This  is           a string';

select @xml = cast(('<X>'+replace(@s1,@delimiter ,'</X><X>')+'</X>') as xml)

select top 3 @out = 
    COALESCE(@out + ' ', '') +  C.value('.', 'varchar(100)') 
from @xml.nodes('X') as X(C)
where LEN(C.value('.', 'varchar(10)')) > 0

select @out
1 голос
/ 04 мая 2011

Теперь ваше дело содержит два шага:

1.Удаление дополнительных пробелов и преобразование их в один пробел.Для этого можно использовать метод REPLACE ().

SELECT REPLACE(REPLACE(REPLACE("This    is   a   string",' ','<>'),'><',''),'<>',' ')

Процесс: самый внутренний REPLACE заменяет все пробелы на пару меньше чем больше.Если между This и is есть три пробела, самый внутренний REPLACE возвращает This <> <> <> is.Средняя замена заменяет все пары больше-меньше-меньше на пустую строку, которая удаляет их.<> <> <> Is становится <> is.

Внешний REPLACE заменяет все пары меньше, чем больше, на один пробел.<> Is становится The is.

Теперь все предложения нормализуются с одним пробелом.

2.Разделите слова и получите три слова.

Есть много вопросов о Stackoverflow, которые их обсуждают.Мне понравилось выражение Common Table Expression, чтобы разделить строку: Как разделить строку, чтобы я мог получить доступ к элементу x?

Дайте мне знать, если вам нужна помощь в разделении слов.

0 голосов
/ 09 марта 2018

SQL Server 2016 (уровень совместимости 130) позволяет использовать STRING_SPLIT функцию:

DECLARE @delimiter varchar(10) = ' '

SELECT STRING_AGG(value, @delimiter) 
    FROM  (SELECT TOP 3 value FROM STRING_SPLIT('This is a string', @delimiter) WHERE LEN(value)>0) inq

SELECT STRING_AGG(value, @delimiter) 
    FROM (SELECT TOP 3 value FROM STRING_SPLIT('This  is a          string ', @delimiter) WHERE LEN(value)>0) inq

SELECT STRING_AGG(value, @delimiter) 
    FROM (SELECT TOP 3 value FROM STRING_SPLIT('This  is           a string', @delimiter) WHERE LEN(value)>0) inq

SELECT STRING_AGG(value, @delimiter) 
    FROM (SELECT TOP 3 value FROM STRING_SPLIT('This      is a    string', @delimiter) WHERE LEN(value)>0) inq

Результат:

This is a
This is a
This is a
This is a
0 голосов
/ 04 мая 2011

Создание таблицы подсчета:

SELECT TOP 11000 
    IDENTITY( INT,1,1 ) AS Num
INTO    dbo.Tally
FROM    Master.dbo.SysColumns sc1,
    Master.dbo.SysColumns sc2
GO

Создание функции с таблицей:

CREATE FUNCTION dbo.[fnSetSplit]
   (
     @String VARCHAR(8000),
     @Delimiter CHAR(1)
   )
RETURNS TABLE
AS
RETURN
   ( SELECT Num,
            SUBSTRING(@String, CASE Num
                                 WHEN 1 THEN 1
                                 ELSE Num + 1
                               END,
                      CASE CHARINDEX(@Delimiter, @String,
                                     Num + 1)
                        WHEN 0
                        THEN LEN(@String) - Num + 1
                        ELSE CHARINDEX(@Delimiter,
                                       @String, Num + 1)
                             - Num
                             - CASE WHEN Num > 1 THEN 1
                                    ELSE 0
                               END
                      END) AS String
     FROM   dbo.Tally
     WHERE  Num <= LEN(@String)
            AND ( SUBSTRING(@String, Num, 1) = @Delimiter
                  OR Num = 1 )
   )

Функция запроса:

SELECT TOP 3
        fss.String
FROM    dbo.fnSetSplit('This  is           a string', ' ') fss
WHERE   NOT ( fss.String = '' )

Если вам нужно повторно объединить,посмотрите на конкатенацию строк, используя FOR XML (PATH)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...