Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL 2005, получение из строки первых 2-х или трех слов?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Извините за такой вопрос. Надо получить из строки первые два (или три) слова. Разделителем слов является пробел. Например:

SELECT Функция('Слово1 Слово2 Слово3 Слово4',2)
Чтобы возвращало 'Слово1 Слово2'.
Заранее спасибо.
12 июл 11, 15:24    [10962165]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005, получение из строки первых 2-х или трех слов?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
charindex + left

Сообщение было отредактировано: 12 июл 11, 15:27
12 июл 11, 15:27    [10962200]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005, получение из строки первых 2-х или трех слов?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Гавриленко Сергей Алексеевич
charindex + left

Спасибо для 2- слов сделал, а для 3-х получается очень сложно. Вот пример:
LEFT(RTRIM(T1.НаименованиеКратко),CHARINDEX(' ',RTRIM(T1.НаименованиеКратко))) + ' ' +
	LEFT(RIGHT(RTRIM(T1.НаименованиеКратко), LEN(RTRIM(T1.НаименованиеКратко))-CHARINDEX(' ',RTRIM(T1.НаименованиеКратко))),
	CHARINDEX(' ',
		RIGHT(RTRIM(T1.НаименованиеКратко), LEN(RTRIM(T1.НаименованиеКратко))-CHARINDEX(' ',RTRIM(T1.НаименованиеКратко)))
		))
12 июл 11, 16:27    [10962820]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005, получение из строки первых 2-х или трех слов?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SET NOCOUNT ON;

DECLARE @S VARCHAR(1000), @N INT;
SET @S='Слово1 Слово2 Слово3 Слово4';
SET @N=2;

WITH Words(N,W) AS
(
 SELECT ROW_NUMBER()OVER(ORDER BY number), SUBSTRING(@S,number, CHARINDEX(' ',@S+' ',number+1)-number)
 FROM master.dbo.spt_values
 WHERE type='P' AND number BETWEEN 1 AND LEN(@S)+1
   AND SUBSTRING(' '+@S,number,1)=' ' AND SUBSTRING(' '+@S,number+1,1)<>' '
)
SELECT N, W
FROM Words
WHERE N<=@N;
12 июл 11, 16:50    [10963015]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005, получение из строки первых 2-х или трех слов?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Простите, забыл, что надо вернуть не строки со словами, а часть исходной строки
SET NOCOUNT ON;

DECLARE @S VARCHAR(1000), @N INT;
SET @S='Слово1 Слово2 Слово3 Слово4';
SET @N=3;

WITH Words(N,L) AS
(
 SELECT ROW_NUMBER()OVER(ORDER BY number), CHARINDEX(' ',@S+' ',number+1)-1
 FROM master.dbo.spt_values
 WHERE type='P' AND number BETWEEN 1 AND LEN(@S)+1
   AND SUBSTRING(' '+@S,number,1)=' ' AND SUBSTRING(' '+@S,number+1,1)<>' '
)
SELECT LEFT(@S,L)
FROM Words
WHERE N=@N;
12 июл 11, 16:59    [10963088]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005, получение из строки первых 2-х или трех слов?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
А так может попроще будет (без ROW_NUMBER())
SET NOCOUNT ON;

DECLARE @S VARCHAR(1000), @N INT;
SET @S='Слово1 Слово2 Слово3 Слово4';
SET @N=3;

WITH Words(N,L) AS
(
 SELECT TOP(@N) number, CHARINDEX(' ',@S+' ',number+1)-1
 FROM master.dbo.spt_values
 WHERE type='P' AND number BETWEEN 1 AND LEN(@S)+1
   AND SUBSTRING(' '+@S,number,1)=' ' AND SUBSTRING(' '+@S,number+1,1)<>' '
 ORDER BY number
)
SELECT TOP(1) LEFT(@S,L)
FROM Words
ORDER BY N DESC;
12 июл 11, 17:04    [10963133]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005, получение из строки первых 2-х или трех слов?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
declare @str varchar(50) = 'Слово1 Слово2 Слово3 Слово4'
 
select parsename(replace(@str, ' ', '.'),4), parsename(replace(@str, ' ', '.'),3)
12 июл 11, 17:17    [10963258]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005, получение из строки первых 2-х или трех слов?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Knyazev Alexey
declare @str varchar(50) = 'Слово1 Слово2 Слово3 Слово4'
 
select parsename(replace(@str, ' ', '.'),4), parsename(replace(@str, ' ', '.'),3)
А если слов 125, а не 4?
А если возможны несколько пробелов подряд?
12 июл 11, 17:25    [10963317]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005, получение из строки первых 2-х или трех слов?  [new]
aleks2
Guest
CREATE function [dbo].[f_StrToTableEx](@str varchar(8000), @delimiter varchar(64)=',')
returns table as
return(
WITH str_nums ( n1, n2, Number ) 
AS 
( 
select  1-DATALENGTH(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number  
UNION ALL 
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+DATALENGTH(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH(@str)
) 
SELECT SUBSTRING(@str, n1+DATALENGTH(@delimiter), n2-n1-DATALENGTH(@delimiter)) as Value, Number, n1+DATALENGTH(@delimiter) as StartPosition FROM str_nums
)

GO

ALTER function [dbo].[f_GetWordsLeft](@str varchar(8000), @N int)
returns varchar(8000)
as
begin
 declare @r varchar(8000) 
 declare @t TABLE (word varchar(1000), n int primary key clustered)

 insert @t(word, n)
 select Value, Number from [dbo].[f_StrToTableEx](@str, ' ') WHERE Value<>''
 
 set @r=''
 select TOP(@N) @r=@r+' '+word FROM @t
 
 return @r
 
end
GO

declare @s nvarchar(1000)
set @s='Слово1     Слово2    Слово3   Слово4'

select dbo.f_GetWordsLeft(@s,3)
12 июл 11, 17:35    [10963410]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить